4

sequenceATraversable 代表什么?为什么最后有大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。

4

1 回答 1

9

“A”代表,如's 类型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]

ApplicativeTraversable被引入时,该函数从列表泛化到任何Traversable[1]:

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)

sequenceMonad约束是不必要的限制。然而,在当时,将其进一步推广Applicative并不是一种选择。问题是,直到去年年初,它还不是应有Applicative的超类,因此将签名推广到会破坏任何缺少实例的with monad 的使用。既然如此,在通用版本的名称中添加了一个额外的“A”。MonadApplicativesequenceApplicative


[1]:但是请注意,Prelude 直到最近才继续携带特定于列表的版本。

于 2016-10-21T16:09:23.330 回答