【发布时间】:2017-03-04 00:39:06
【问题描述】:
来自 Traversable 的sequenceA 代表什么?为什么最后有大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。
【问题讨论】:
标签: haskell naming-conventions traversable
来自 Traversable 的sequenceA 代表什么?为什么最后有大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。
【问题讨论】:
标签: haskell naming-conventions traversable
“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 的Monad 约束是不必要的限制。然而,在当时,将其进一步推广到Applicative 并不是一种选择。问题是直到去年年初,Applicative 还不是 Monad 的超类,因此将签名推广到 Applicative 会破坏 sequence 与缺少 @987654339 的单子的任何使用@ 实例。既然如此,就在通用版本的名称中添加了一个额外的“A”。
[1]:但是请注意,Prelude 直到最近才继续携带特定于列表的版本。
【讨论】: