Traversable的sequenceA
代表什么?为什么最后有资本A?我已经学习了几个月的Haskell,这是一段时间以来困扰我的事情之一。
答案 0 :(得分:7)
“A”代表Applicative
,与sequenceA
类型中的约束相同:
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
“A”是历史事故的结果。曾几何时,Haskell中既不存在Applicative
也不存在Traversable
。尽管如此,一个与sequenceA
完全相同的函数已经存在 - 除了它有一个更具体的类型:
sequence :: Monad m => [m a] -> m [a]
引入Applicative
和Traversable
后,该功能会从列表推广到任何Traversable
[1]:
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
sequence
的{{1}}约束是不必要的限制。然而,当时,将其进一步推广到Monad
并不是一种选择。问题是,直到去年年初,Applicative
并不是Applicative
的超类,因此将签名推广到Monad
会破坏Applicative
的任何使用使用缺少sequence
实例的monad。既然如此,在通用版本的名称中添加了额外的“A”。
[1]:但请注意,Prelude在最近才继续使用特定于列表的版本。