使用ghci
我已经计算:绑定变量
Prelude> let m = [1,2]
Prelude> let ys = [4, 5, 6]
Prelude> m >>= (\x -> ys >>= (\y -> return (x, y)))
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6)]
上面的单子表达似乎并不对应于单子关联法的两边:
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
我会想知道单子结合性如何应用于表达式:
m >>= (\x -> ys >>= (\y -> return (x, y)))
B因为return (x,y)
在周围的函数和包含它的函数都关闭,所以在这个例子中似乎不存在结合律(m >>= f)
左边存在的中间单子。
我不太看的关联性法律的右手侧的功能。 'ys'不消耗绑定的'x',即你的函数不是一元正规形式。 – thumphries
@shelf我认为它归结为这样一个事实:'\ x - > x'是一个函数,但'\ x - >(x,y)'不是。例如, '[1,2] >> =(\ x - > [x,x + 1] >> =(\ y - > [y + 20,y-20]))''given'[21 ,[-19,22,-18,22,-18,23,-17]'和(尊重联想律) '[1,2] >> =(\ x - > [x,x + 1]) >> =(\ y - > [y + 20,y-20])'给出了'[21,-19,22,-18,22,-18,23,-17]'然而,尽管 '[1 ,2] >> =(\ x - > [x,x + 1] >> =(\ y - > [x + y + 20,y-20]))''给出'[22,-19,23, -18,24,-17]',这 '[1,2] >> =(\ x - > [x,x + 1])>> =(\ y - > [x + y + 20,y-20])'会产生错误 –