2

我定义了一个低优先级(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]

4

1 回答 1

13

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

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

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

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

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

于 2013-08-18T13:30:35.360 回答