3

我试图弄清楚如何用前缀符号重写一元计算(不是为了真正的实际目标,只是为了研究),但是一个 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'

但是如果我让最后一个不使用它(通过将 x 替换为 y),则计算开始工作

*Main> (>>=) ( (>>=)  [1, 3, 4] (\x -> [x + 1, x - 1]) ) (\y -> return (y*y))
[4,0,16,4,25,9]

那么前缀符号的完全重写在技术上是可能的吗?或者访问其他 lambdas 参数的这个属性是中缀符号独有的?

4

1 回答 1

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

于 2013-03-17T07:38:03.450 回答