作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
monad 和 applicative 的区别在于前者可以根据之前的结果选择下一个计算:
(\x -> if x == 1 then (\_ -> []) else (\y -> (\z -> \w -> [x,y,z]) =<< sqr) =<< (+1)) =<< (+1) $ 0
-- ^
(\w x -> if x == 1 then (\_ _ -> []) else (\y z -> [x,y,z])) <*> (+1) <*> (+1) <*> sqr $ 0
-- ^^^
liftM
进行比较:
liftM3 (\x -> if x == 1 then (\_ _ -> []) else (\y z -> [x,y,z])) (+1) (+1) sqr $ 0
-- ^^^
appM3 w f x g y h z =
f(\x' -> g(\y' -> h(\z' -> w x' y' z') z) y) x
appM3 (\x -> if x == 1 then (\_ _ _ -> []) else (\y z _ -> [x, y, z])) (=<<) (+1) (=<<) (+1) (=<<) sqr $ 0
-- ^^^^^
最佳答案
你是对的。 liftM
只是 fmap
, 和 liftM2
只是 liftA2
.它们的存在是标准库中仍然僵化的历史产物,而不是实际需要单子(monad)绑定(bind)操作的力量的东西。
以前版本的标准库没有使 Functor
和 Applicative
Monad
的父类(super class). (如果你回溯到足够远,Applicative
甚至都不存在。)因此,为了实用性,创建了执行相同操作的函数以与 Monad
一起使用。 .它们在 Applicative-Monad 提案的过渡中幸存下来,因为它们对一个目的仍然有用 - 如果您手动实现所有类,则可以使用它们来实现类型的 Functor
和 Applicative
Monad
方面的实例代码。
关于haskell - liftM 函数是否被剥夺了它们的一元本质?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60197622/
我是一名优秀的程序员,十分优秀!