我最近在ISBN Verifier为Exercism练习编写了一个解决方案,当我通过pointfree.io运行此功能时:
\c -> isDigit c || c == 'X'
我回来了:
liftM2 (||) isDigit ('X' ==)
为什么pointfree.io从liftM2
中选择Control.Monad
而不是liftA2
中的Control.Applicative
?
答案 0 :(得分:6)
事实是Control.Monad
比Control.Applicative
年长。
Monads已经在Haskell 98中,而关于applicative functors的论文是在2007年推出的.Hackage中的软件包自2005年开始存在。
由于历史意外,应用仿函数并未实现为Monad的超类,而是作为单独的类型实现。事实证明,在实践中,对这种分离的要求非常少,因此在2014年,有人建议将Applicative追溯为Monad的超类。
所以liftM{N}
仍然有效。