为什么pointfree.io选择liftM2而不是liftA2?

Jef*_*att 0 monads haskell functor applicative

我最近在Exercism上为ISBN Verifier练习编写了一个解决方案,当我通过pointfree.io运行这个函数时:

\c -> isDigit c || c == 'X'
Run Code Online (Sandbox Code Playgroud)

我回来了:

liftM2 (||) isDigit ('X' ==)
Run Code Online (Sandbox Code Playgroud)

为什么pointfree.io选择liftM2从Control.Monad,而不是liftA2从Control.Applicative?

小智 6

事实是,这Control.Monad比年龄大得多Control.Applicative.

Monads已经在Haskell 98中,而关于applicative functors的论文是在2007年推出的.Hackage中的软件包自2005年开始存在.

维基百科:

由于历史事故,应用函子并未实现为Monad的超类,而是作为单独的类型实现.事实证明,在实践中,对这种分离的需求非常少,所以在2014年,有人建议将Applicative追溯为Monad的超类.

所以liftM{N}仍然有效.