什么是 "applicative transformation" in naturality of traversability?

What is a "applicative transformation" in naturality of traversability?

Traversableclass中的traversesequenceA函数必须满足以下'naturality'定律:

t . traverse f == traverse (t . f)
t . sequenceA == sequenceA . fmap t

每个 'applicative transformation' t。但它是什么?

它似乎不适用于 instance Traversable []t = tail:

Prelude> tail . sequenceA $ [[1],[2,3]]
[[1,3]]
Prelude> sequenceA . fmap tail $ [[1],[2,3]]
[]

也不是 t = join (++)(重复列表两次):

Prelude Control.Monad> join (++) . sequenceA $ [[1],[2,3]]
[[1,2],[1,3],[1,2],[1,3]]
Prelude Control.Monad> sequenceA . fmap (join (++)) $ [[1],[2,3]]
[[1,2],[1,3],[1,2],[1,3],[1,2],[1,3],[1,2],[1,3]]

那么t他们满意的是什么?

Data.Traversable 的 Hackage 页面定义了一个应用转换,如下所示。

[A]n applicative transformation is a function

t :: (Applicative f, Applicative g) => f a -> g a

preserving the Applicative operations, i.e.

t (pure x) = pure x

t (x <*> y) = t x <*> t y

最简单的例子就是恒等函数。 id 是一个应用转换。一个更具体的列表示例是 reverse.

reverse (pure x) = reverse [x] = [x] = pure x
-- (the (<*>) law is more difficult to show)

并且您可以在 GHCi 中验证您引用的法则确实适用于 reverse

Prelude> reverse . sequenceA $ [[1], [2,3]]
[[1,3],[1,2]]
Prelude> sequenceA . fmap reverse $ [[1], [2,3]]
[[1,3],[1,2]]

来源:Data.Traversable