gpt4 book ai didi

haskell - 为什么中缀运算符在 let/do 绑定(bind)中失去固定性

转载 作者:行者123 更新时间:2023-12-02 14:35:29 24 4
gpt4 key购买 nike

我定义了一个低优先级(lowMult)中缀运算符,如下所示:

a `lowMult` b = a*b  
infix 1 `lowMult`

以便 GHCi 评估 8-1 `lowMult` 4 + 242
但是,在列表理解中,例如: [8 - 1 `op` 4 + 2 | op <- [lowMult]] ,运算符( op )似乎有 (*)固定性,因为 GHCi 将先前的列表理解评估为 [6]

最佳答案

在 Haskell 中,固定性是按名称定义的。因此,如果您为操作符定义一个新名称,该名称将具有其自身的固定性——与原始名称不同。

在列表理解中,您为 lowMult--op 定义一个新名称。由于您没有指定 op 的固定性,因此它会获得默认级别,这是具有左关联性的最高可能固定性。这使得它比乘法结合更紧密

这种行为确实是唯一合乎逻辑的选择。否则,在这种情况下你会怎么做?

[8 - 1 `op` 4 + 2 | op <- [lowMult, (*)]]

如果运算符作为参数或更复杂表达式本身的结果传入会怎样?所有运算符的固定性都必须在编译时定义,因此不能依赖于这样的运行时信息。

关于haskell - 为什么中缀运算符在 let/do 绑定(bind)中失去固定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299526/

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