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

时间:2013-02-23 00:22:30

标签: haskell monads

这个问题来自于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中?

2 个答案:

答案 0 :(得分:7)

  

现在我有点困惑,如果将Int作为第一个参数但是x是M Int,你怎么能把x放入g?

有两个不同的x变量,而内部变量在lambda表达式中遮蔽外部变量。编写代码的更清晰的方法就像

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

答案 1 :(得分:7)

Missingno指出了一个至关重要的步骤,但这个名义问题的答案是:liftM2 (+)