Traversable法则能否源于每个Traversable都是Functor的事实?

Jak*_*old 10 theory haskell traversal

我一直在想为什么Traversable类型类需要a FunctorFoldable,而不仅仅是Foldable,因为它不使用任何部分Functor

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)
Run Code Online (Sandbox Code Playgroud)

似乎Traversable的法则没有出现在基础4.6的文档中,这使我认为它们可以源于每个Traversable都是Functor的事实?

迭代器模式论文本质(第5.1节)中,它指出有一些自由定理traverse直接来自它的类型,但本文没有深入描述为什么会出现这种情况.

Traversable 基础4.7文档中描述法律来自何处?

lef*_*out 10

基本上,任何* -> *在其参数中协变的类型构造函数都是规范的仿函数.由于Applicative f显然是协变的,因此t签名sequenceA :: t (f a) -> f (t a)有意义,因此Functor要求本质上是多余的.但就像长期遗漏因为不需要的Applicative => Monad超类一样,省略这种"明显"的要求并不是一个好主意,它只会导致代码重复和混淆同义函数.