Haskell “a”是什么;“应用性转换”;在可遍历性的自然性中?

Haskell “a”是什么;“应用性转换”;在可遍历性的自然性中?,haskell,applicative,traversable,Haskell,Applicative,Traversable,Traversable类中的traverse和sequenceA函数必须满足以下“自然性”法则: t . traverse f == traverse (t . f) t . sequenceA == sequenceA . fmap t 对于每个“应用性转换”t。但这是什么呢 对于t=tail,它似乎不适用于实例可遍历[]: Prelude> tail . sequenceA $ [[1],[2,3]] [[1,3]] Prelude> sequenceA . fmap tail

Traversable
类中的
traverse
sequenceA
函数必须满足以下“自然性”法则:

t . traverse f == traverse (t . f)
t . sequenceA == sequenceA . fmap t
对于每个“应用性转换”
t
。但这是什么呢

对于
t=tail
,它似乎不适用于
实例可遍历[]

Prelude> tail . sequenceA $ [[1],[2,3]]
[[1,3]]
Prelude> sequenceA . fmap tail $ [[1],[2,3]]
[]
对于
t=join(+)
(重复列表两次)也不适用:


那么,对于他们满意的内容是什么呢?

数据的Hackage页面

[A] 应用转换是一个函数

t :: (Applicative f, Applicative g) => f a -> g a
保留应用程序操作,即

t (pure x) = pure x

t (x <*> y) = t x <*> t y
您可以在GHCi中验证您引用的法律是否适用于<代码>反向

reverse (pure x) = reverse [x] = [x] = pure x
-- (the (<*>) law is more difficult to show)
Prelude> reverse . sequenceA $ [[1], [2,3]]
[[1,3],[1,2]]
Prelude> sequenceA . fmap reverse $ [[1], [2,3]]
[[1,3],[1,2]]


来源:

数据的黑客页面。Traversable定义了一个应用程序转换,如下所示

[A] 应用转换是一个函数

t :: (Applicative f, Applicative g) => f a -> g a
保留应用程序操作,即

t (pure x) = pure x

t (x <*> y) = t x <*> t y
您可以在GHCi中验证您引用的法律是否适用于<代码>反向

reverse (pure x) = reverse [x] = [x] = pure x
-- (the (<*>) law is more difficult to show)
Prelude> reverse . sequenceA $ [[1], [2,3]]
[[1,3],[1,2]]
Prelude> sequenceA . fmap reverse $ [[1], [2,3]]
[[1,3],[1,2]]


资料来源:

《法典》法则更难正式表述,但如果你用《法典》和《法典》地图》来表达它,我认为它至少会在直觉上变得清晰。基本原理是
concat(reverse(map reverse xss))=reverse(concat xss)
。看看几个小例子,任何人都会相信这是真的<代码>反向(concat[[1,2],[3,4,5]])=[5,4,3,2,1]=concat[[5,4,3],[2,1]]=concat(反向(映射反向[[1,2],[3,4,5]])。
法则更难正式表达,但如果你用
concat
map
来表达,我认为它至少会直观地清晰起来。基本原理是
concat(reverse(map reverse xss))=reverse(concat xss)
。看看几个小例子,任何人都会相信这是真的<代码>反向(concat[[1,2],[3,4,5]])=[5,4,3,2,1]=concat[[5,4,3],[2,1]]=concat(反向(映射反向[[1,2],[3,4,5]]),例如,
数据中需要注意的另一件事。可遍历的
文档是“自然法则是由参数隐含的。”这基本上意味着任何通过类型检查器的
遍历
定义都将遵守自然法则;你不必担心。在
数据.Traversable
文档中要注意的另一件事是“自然法则由参数隐含”。这基本上意味着通过类型检查器的
traverse
的任何定义都将遵守自然法则;你不必担心。