据我了解,两个单子(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/