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

时间:2019-04-03 03:41:32

标签: haskell functional-programming

序列的签名是

sequence :: Monad m => t (m a) -> m (t a)

但是我们可以将其实现为

sequence = traverse id

要求m仅是Applicative。如果monad是可应用的,那为什么还要在类型级别上受此限制呢?

1 个答案:

答案 0 :(得分:5)

Haskell中有许多功能是等效的但又有所不同,因为Applicative(分别是Functor)过去并不是Monad的超类。例如:

  • returnpure

  • ap<*>

  • liftMliftAfmap

  • liftM2liftM3等。与liftA2liftA3,&c。

  • mapM / forMtraverse / for

  • mapM_ / forM_traverse_ / for_

  • sequencesequenceA

  • mzeromplus(来自MonadPlus)与empty<|>(来自Alternative

带有原始Monad签名的旧函数仍然存在,但是在新代码中,由于实现了Applicative–Monad Proposal (AMP),因此您可以始终使用Applicative版本,因为它们略有不同更笼统-也就是说,您始终可以将return替换为pure,反之亦然。