gpt4 book ai didi

haskell - 用前缀表示法重写 monad 计算

转载 作者:行者123 更新时间:2023-12-02 18:22:40 24 4
gpt4 key购买 nike

我正在尝试找出如何使用前缀表示法重写一元计算(不是为了真正的实际目标,只是为了研究),但是一个 lambda 看不到另一个 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]

那么在技术上可以用前缀表示法完全重写吗?或者访问其他 lambda 参数的属性是中缀表示法独有的?

最佳答案

问题是您的优先级稍有错误,另请参阅 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 -> ... 的主体内可见。

关于haskell - 用前缀表示法重写 monad 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com