sequenceA中的A代表什么?
what does the A stand for in sequenceA?
Traversable 中的 sequenceA
代表什么?为什么最后要大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。
"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
的任何使用] 缺少 Applicative
实例的单子。既然如此,在通用版的名字上多加了一个"A"
[1]:但是请注意,Prelude 直到最近才继续使用特定于列表的版本。
Traversable 中的 sequenceA
代表什么?为什么最后要大写A?我已经学习 Haskell 几个月了,这是困扰我一段时间的事情之一。
"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
的任何使用] 缺少 Applicative
实例的单子。既然如此,在通用版的名字上多加了一个"A"
[1]:但是请注意,Prelude 直到最近才继续使用特定于列表的版本。