Haskell 如何定义签名h::M Int->;的函数;M Int->;M Int使得h(mx)(my)=M(x+;y)而不展开单子?
这个问题来自于在上找到的文章“琐碎的单子”。提供的答案是Haskell 如何定义签名h::M Int->;的函数;M Int->;M Int使得h(mx)(my)=M(x+;y)而不展开单子?,haskell,monads,Haskell,Monads,这个问题来自于在上找到的文章“琐碎的单子”。提供的答案是 h x y = x >>= (\x -> g x y) 或同等地(在本条的上下文中) g在哪里 g :: Int -> W Int -> W Int g x y = y >>= (return . (+x)) 对于单子: data W a=W a派生显示 现在我有点困惑了,如果它把一个Int作为第一个参数,但是x是W Int,你怎么能把x放在g中呢 现在我有点困惑了,如果它以Int作为第一个参
h x y = x >>= (\x -> g x y)
或同等地(在本条的上下文中)
g在哪里
g :: Int -> W Int -> W Int
g x y = y >>= (return . (+x))
对于单子:
data W a=W a派生显示
现在我有点困惑了,如果它把一个Int
作为第一个参数,但是x是W Int
,你怎么能把x放在g中呢
现在我有点困惑了,如果它以Int作为第一个参数,但x是M Int,你怎么能把x放在g中呢
有两个不同的x
变量,内部变量在lambda表达式中隐藏外部变量。编写代码的更清晰方法如下
h mx my = mx >>= (\x -> g x my)
Missingno指出了一个关键步骤,但对这个名义问题的答案是:
liftM2(+)
h mx my = mx >>= (\x -> g x my)