Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何定义签名h::M Int->;的函数;M Int->;M Int使得h(mx)(my)=M(x+;y)而不展开单子?_Haskell_Monads - Fatal编程技术网

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)