我定义了一个低优先级(lowMult)中缀运算符,如下所示:
a `lowMult` b = a*b
infix 1 `lowMult`
因此 GHCi 评估8-1 `lowMult` 4 + 2
为42
但是,在像 : 这样的列表理解中 [8 - 1 `op` 4 + 2 | op <- [lowMult]]
,运算符 ( op
) 似乎具有(*)
固定性,因为 GHCi 将先前的列表理解评估为[6]
我定义了一个低优先级(lowMult)中缀运算符,如下所示:
a `lowMult` b = a*b
infix 1 `lowMult`
因此 GHCi 评估8-1 `lowMult` 4 + 2
为42
但是,在像 : 这样的列表理解中 [8 - 1 `op` 4 + 2 | op <- [lowMult]]
,运算符 ( op
) 似乎具有(*)
固定性,因为 GHCi 将先前的列表理解评估为[6]
在 Haskell 中,fixities 是按name定义的。因此,如果您为操作员定义一个新名称,该名称将具有其自身的固定性——与原始名称不同。
在您的列表理解中,您为lowMult
--定义了一个新名称op
。由于您没有指定op
' 的固定性,它会获得默认级别,这是具有左关联性的最高可能固定性。这使得它比乘法绑定更紧密。
这种行为确实是唯一合乎逻辑的选择。在这种情况下你会怎么做,否则?
[8 - 1 `op` 4 + 2 | op <- [lowMult, (*)]]
如果运算符是作为参数传入的,或者是更复杂的表达式本身的结果会怎样?所有运算符的固定性必须在编译时定义,因此它不能依赖于这样的运行时信息。