这个问题来自于http://blog.sigfpe.com/2007/04/trivial-monad.html发现的“琐事蒙纳德”一文。提供的答案是
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))
为monad:
data W a = W a deriving Show
现在我有点困惑,如果Int
作为第一个参数但x是W Int
,你怎么能把x加到g中?
答案 0 :(得分:7)
现在我有点困惑,如果将Int作为第一个参数但是x是M Int,你怎么能把x放入g?
有两个不同的x
变量,而内部变量在lambda表达式中遮蔽外部变量。编写代码的更清晰的方法就像
h mx my = mx >>= (\x -> g x my)
答案 1 :(得分:7)
Missingno指出了一个至关重要的步骤,但这个名义问题的答案是:liftM2 (+)
。