为什么中缀运算符在let / do绑定中失去了固定性

时间:2013-08-18 13:20:20

标签: haskell

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

1 个答案:

答案 0 :(得分:13)

在Haskell中,每个名称定义了固定性。因此,如果为运算符定义新名称,则该名称将具有自己的固定性 - 与原始名称不同。

在列表推导中,您为lowMult - op定义新名称。由于您没有指定op的固定性,因此它获得默认级别,这是具有左关联性的最高可能固定性。这使得它甚至更紧而不是乘法。

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

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

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