我正在试图弄清楚如何用前缀表示法重写monadic计算(不是为了实际目标,仅用于研究),而是一个lambda看不到另一个参数的问题
所以给出一个工作实例
*Main> [1, 3, 4] >>= \x -> [x + 1, x - 1] >>= \y -> return (y*x)
[2,0,12,6,20,12]
重写的那个显示错误,没有看到其他lambda的参数
*Main> (>>=) ( (>>=) [1, 3, 4] (\x -> [x + 1, x - 1]) ) (\y -> return (y*x))
<interactive>:133:68: Not in scope: `x'
但如果我让最后一个不使用它(通过用y替换x),计算开始工作
*Main> (>>=) ( (>>=) [1, 3, 4] (\x -> [x + 1, x - 1]) ) (\y -> return (y*y))
[4,0,16,4,25,9]
那么技术上可能在前缀表示法中完全重写吗?或者访问其他lambdas参数的这个属性是中缀表示法独有的吗?
答案 0 :(得分:8)
问题是您的优先级略有错误,另请参阅Haskell Precedence: Lambda and operator
lambda表达式的主体尽可能向右延伸。然后您的示例括起来如下:
[1, 3, 4] >>= (\x -> [x + 1, x - 1] >>= (\y -> return (y*x)))
将其置于前缀表单中会产生
(>>=) [1, 3, 4] (\x -> (>>=) [x + 1, x - 1] (\y -> return (y*x)))
x
的正文中显示\y -> ...
。