2013-02-23 55 views
3

此問題來自文章「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?

回答

7

現在我有點困惑,如果需要一個Int作爲第一個參數,但x是M Int,那麼如何將x放入g中?

有兩個不同的x變量,內部的變量是在lambda表達式內部映射的外部變量。寫代碼更明確的方式將類似

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

+1三角龍 – chibro2 2013-02-23 00:37:47

7

Missingno指出了關鍵的一步,但答案的名義的問題是:liftM2 (+)

相關問題