Haskell 可遍历定律能否从每个可遍历函数也是函子这一事实中推导出来?
我一直在想为什么Haskell 可遍历定律能否从每个可遍历函数也是函子这一事实中推导出来?,haskell,theory,traversal,Haskell,Theory,Traversal,我一直在想为什么可遍历类型类既需要函子又需要可折叠,而不仅仅是可折叠,因为它不使用函子的任何部分 class (Functor t, Foldable t) => Traversable t where traverse :: Applicative f => (a -> f b) -> t a -> f (t b) sequenceA :: Applicative f => t (f a) -> f (t a) 似乎是关于可遍历性的
可遍历
类型类既需要函子
又需要可折叠
,而不仅仅是可折叠
,因为它不使用函子
的任何部分
class (Functor t, Foldable t) => Traversable t where
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
sequenceA :: Applicative f => t (f a) -> f (t a)
似乎是关于可遍历性的定律,这让我认为它们可以从每个可遍历性都是函子这一事实中推导出来
在本文中,它指出有一些关于导线测量的自由定理直接来自于它的类型,但本文没有深入描述为什么会出现这种情况
可遍历的从何而来?基本上,任何类型的构造函数在其参数中都是协变的。由于Applicative f
显然是协变的,因此签名sequenceA::t(fa)->f(ta)
的t
也是协变的,因此函子
要求本质上是多余的。但就像长期缺少的,因为不需要的Applicative=>Monad
超类一样,忽略这些“明显的”需求并不是一个好主意,它只会导致代码重复和混淆同义函数