什么是 "applicative transformation" in naturality of traversability?
What is a "applicative transformation" in naturality of traversability?
Traversable
class中的traverse
和sequenceA
函数必须满足以下'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]]
Traversable
class中的traverse
和sequenceA
函数必须满足以下'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]]