bot*_*aio 6 haskell functional-programming
序列的签名是
sequence :: Monad m => t (m a) -> m (t a)
Run Code Online (Sandbox Code Playgroud)
但是我们可以实现为
sequence = traverse id
Run Code Online (Sandbox Code Playgroud)
要求m公正Applicative。如果monad是applicatives,那么为什么还要在类型级别上有这个约束呢?
Haskell中有许多功能是等效的但又有所不同,因为Applicative(resp。Functor)以前不是的超类Monad。例如:
return 与 pure
ap 与 <*>
liftMvs. liftAvs.fmap
liftM2,liftM3,&C。与liftA2。liftA3,&c。
mapM/ forM与traverse/for
mapM_/ forM_与traverse_/for_
sequence 与 sequenceA
mzero&mplus(from MonadPlus)vs. empty&<|>(from Alternative)
带有原始Monad签名的旧功能仍然存在,但是在新代码中,由于实施了“ 应用程序-Monad提案”(AMP),因此您始终可以使用这些Applicative版本,因为它们的通用性稍高一些,也就是说,您始终可以将其替换return为pure,反之亦然。