bob*_*bob 2 monads haskell functional-programming
根据我的理解,两个 monadic 操作都应该具有同样的表现力:
(^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
-- ^^^^^^
Run Code Online (Sandbox Code Playgroud)
(请随意缩进上面的代码,因为我不知道如何在不破坏语法的情况下进行)
两种计算都产生相同的结果[],然而,它们的不同之处在于只有后者短路,而前者必须通过整个结构。只要可以忽略影响,这不是问题,因此是幂等的,这当然不适用于所有可能的实例。
我可能使用join不正确,但我看不到如何通过应用计算获得短路。似乎短路语义是从一元计算的嵌套结构中产生的。
情况总是这样
join m = m >>= id
m >>= f = join (f <$> m)
Run Code Online (Sandbox Code Playgroud)
您可以使用这些定律在join和之间进行转换>>=。