3

这个问题来自http://blog.sigfpe.com/2007/04/trivial-monad.html上的文章“Trivial 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

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

4

2 回答 2

7

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

有两个不同x的变量,内部的一个在 lambda 表达式中隐藏了外部的一个。编写代码的更清晰的方法是

h mx my = mx >>= (\x -> g x my)
于 2013-02-23T00:31:34.277 回答
7

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

于 2013-02-23T01:47:42.107 回答