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

chi*_*ro2 3 monads haskell

这个问题来自http://blog.sigfpe.com/2007/04/trivial-monad.html上的文章"Trivial Monad" .提供的答案是

h x y = x >>= (\x -> g x y)
Run Code Online (Sandbox Code Playgroud)

或等效(在文章的上下文中)

h :: W Int -> W Int -> W Int 
h x y = bind ( \x-> g x y ) x
Run Code Online (Sandbox Code Playgroud)

其中g是

g :: Int -> W Int -> W Int
g x y = y >>= (return . (+x))
Run Code Online (Sandbox Code Playgroud)

对于monad:

data W a = W a deriving Show

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

hug*_*omg 7

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

有两个不同的x变量,内部变量在lambda表达式内部遮蔽外部变量.编写代码的更清晰的方法就是这样

h mx my = mx >>= (\x -> g x my)
Run Code Online (Sandbox Code Playgroud)


J. *_*son 7

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