【发布时间】:2017-12-28 02:09:17
【问题描述】:
Traversable 类中的 traverse 和 sequenceA 函数必须满足以下“自然性”定律:
t . traverse f == traverse (t . f)
t . sequenceA == sequenceA . fmap t
对于每个“应用转换”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文档中要注意的另一件事是“参数化隐含了自然法则”。这基本上意味着任何通过类型检查器的traverse的定义都将遵守自然法则;你不必担心。
标签: haskell applicative traversable