[英]Why sequence requires monad if applicative would suffice?
序列的签名是
sequence :: Monad m => t (m a) -> m (t a)
但我们可以实现它
sequence = traverse id
要求m
只是Applicative
。 如果monad是applicatives那么为什么在类型级别上有这个约束呢?
Haskell中有许多函数是等价但不同的,因为Applicative
( Functor
)并没有用作Monad
的超类。 例如:
return
与pure
ap
vs. <*>
liftM
vs. liftA
vs. fmap
liftM2
, liftM3
,&c。 与liftA2
, liftA3
,&c。
mapM
/ forM
与traverse
/ for
mapM_
/ forM_
与traverse_
/ for_
sequence
与sequenceA
mzero
& mplus
(来自MonadPlus
)与empty
&&( <|>
来自Alternative
)
具有原始Monad
签名的旧功能仍然存在,但在新代码中,自应用Monad Proposal(AMP)实施以来,您可以始终使用Applicative
版本,因为它们稍微更通用 - 也就是说,您可以随时使用用pure
代替return
,但反之则不然。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.