A在序列A中代表什么?

时间:2016-10-21 16:04:57

标签: haskell naming-conventions traversable

Traversable的sequenceA代表什么?为什么最后有资本A?我已经学习了几个月的Haskell,这是一段时间以来困扰我的事情之一。

1 个答案:

答案 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]

引入ApplicativeTraversable后,该功能会从列表推广到任何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在最近才继续使用特定于列表的版本。