你如何定义一个签名h :: M Int - > M Int - > M Int的函数,使得h(M x)(M y)= M(x + y)而不展开monad?

问题描述:

此问题来自文章“Trivial Monad”,发现于http://blog.sigfpe.com/2007/04/trivial-monad.html。所提供的答案是你如何定义一个签名h :: M Int - > M Int - > M Int的函数,使得h(M x)(M y)= M(x + y)而不展开monad?

h x y = x >>= (\x -> g x y) 

或等效(在制品的上下文中)

h :: W Int -> W Int -> W Int 
h x y = bind (\x-> g x y) x 

其中g是

g :: Int -> W Int -> W Int 
g x y = y >>= (return . (+x)) 

为单子:

data W a = W a deriving Show

现在我有点困惑,如果需要Int作为第一个参数,但是x是W Int,那么如何将x放入g?

现在我有点困惑,如果需要一个Int作为第一个参数,但x是M Int,那么如何将x放入g中?

有两个不同的x变量,内部的变量是在lambda表达式内部映射的外部变量。写代码更明确的方式将类似

h mx my = mx >>= (\x -> g x my) 
+4

+1三角龙 – chibro2 2013-02-23 00:37:47

Missingno指出了关键的一步,但答案的名义的问题是:liftM2 (+)