你如何定义一个签名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)
答
Missingno指出了关键的一步,但答案的名义的问题是:liftM2 (+)
。
+1三角龙 – chibro2 2013-02-23 00:37:47