用前缀表示法重写monad计算

时间:2013-03-17 07:30:57

标签: haskell infix-notation

我正在试图弄清楚如何用前缀表示法重写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参数的这个属性是中缀表示法独有的吗?

1 个答案:

答案 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 -> ...