如果应用程序足够,为什么序列需要monad?

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,那么为什么还要在类型级别上有这个约束呢?

Jon*_*rdy 6

Haskell中有许多功能是等效的但又有所不同,因为Applicative(resp。Functor)以前不是的超类Monad。例如:

  • returnpure

  • ap<*>

  • liftMvs. liftAvs.fmap

  • liftM2liftM3,&C。与liftA2liftA3,&c。

  • mapM/ forMtraverse/for

  • mapM_/ forM_traverse_/for_

  • sequencesequenceA

  • mzeromplus(from MonadPlus)vs. empty<|>(from Alternative

带有原始Monad签名的旧功能仍然存在,但是在新代码中,由于实施了“ 应用程序-Monad提案”(AMP),因此您始终可以使用这些Applicative版本,因为它们的通用性稍高一些,也就是说,您始终可以将其替换returnpure,反之亦然。