sequenceA
Traversable 代表什么?为什么最后有大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。
问问题
384 次
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]
当Applicative
和Traversable
被引入时,该函数从列表泛化到任何Traversable
[1]:
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
sequence
的Monad
约束是不必要的限制。然而,在当时,将其进一步推广Applicative
并不是一种选择。问题是,直到去年年初,它还不是应有Applicative
的超类,因此将签名推广到会破坏任何缺少实例的with monad 的使用。既然如此,在通用版本的名称中添加了一个额外的“A”。Monad
Applicative
sequence
Applicative
[1]:但是请注意,Prelude 直到最近才继续携带特定于列表的版本。
于 2016-10-21T16:09:23.330 回答