序列的签名是
sequence :: Monad m => t (m a) -> m (t a)
但是我们可以将其实现为
sequence = traverse id
要求m
仅是Applicative
。如果monad是可应用的,那为什么还要在类型级别上受此限制呢?
答案 0 :(得分:5)
Haskell中有许多功能是等效的但又有所不同,因为Applicative
(分别是Functor
)过去并不是Monad
的超类。例如:
return
与pure
ap
与<*>
liftM
与liftA
与fmap
liftM2
,liftM3
等。与liftA2
,liftA3
,&c。
mapM
/ forM
与traverse
/ for
mapM_
/ forM_
与traverse_
/ for_
sequence
与sequenceA
mzero
和mplus
(来自MonadPlus
)与empty
和<|>
(来自Alternative
)
带有原始Monad
签名的旧函数仍然存在,但是在新代码中,由于实现了Applicative–Monad Proposal (AMP),因此您可以始终使用Applicative
版本,因为它们略有不同更笼统-也就是说,您始终可以将return
替换为pure
,反之亦然。