haskell - `<$>`/`<*>`/`join` 的组合等于 `>>=` 吗?

标签 haskell functional-programming monads

据我了解,两个单子(monad)操作应该具有同样的表现力:

(^2) >>= (\x -> if x == 4 then \_ -> [] else (+1) >>= (\y -> negate >>= (\z env -> [x, y, z, env]))) $ 2
--                             ^^    

join (((\x -> if x == 4 then \_ _ _ -> [] else \y z env -> [x, y, env, z]) <$> (^2)) <*> (+1)) <*> (negate) $ 2
--                           ^^^^^^

(请随意缩进上面的代码,因为我不知道如何在不破坏语法的情况下缩进)

两种计算产生相同的结果[],然而,它们的不同之处在于仅后者短路而前者必须通过整个结构。这不是问题,只要效果可以忽略,因此是幂等的,这当然不适用于所有可能的实例。

我可能错误地使用了 join,但我看不出如何通过应用计算获得短路。似乎短路语义源于一元计算的嵌套结构。

最佳答案

总是这样

join m = m >>= id
m >>= f = join (f <$> m)

您可以使用这些法则在 join>>= 之间进行转换。

关于haskell - `<$>`/`<*>`/`join` 的组合等于 `>>=` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62718307/

相关文章:

haskell - 使用列表理解的带有谓词的自定义过滤器函数

performance - 为什么在函数式编程中计算阶乘更快/更有效?

java - 什么是组合器以及如何用 java 编写它们

haskell - 应用解析相对于单子(monad)解析有什么好处?

haskell - 从 runST 返回随机生成器

haskell - 在 Haskell 中使用带有列表列表的 map 时出现问题

Haskell QuickCheck 最小反例

haskell - 无法为关联数据系列派生 Typeable

scala - 计算列表的移动平均值

scala - flatMap 和 For-Comprehension with IO Monad