我定义了一个低优先级(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]
答案 0 :(得分:13)
在Haskell中,每个名称定义了固定性。因此,如果为运算符定义新名称,则该名称将具有自己的固定性 - 与原始名称不同。
在列表推导中,您为lowMult
- op
定义新名称。由于您没有指定op
的固定性,因此它获得默认级别,这是具有左关联性的最高可能固定性。这使得它甚至更紧而不是乘法。
这种行为确实是唯一合乎逻辑的选择。在这种情况下你会做什么,否则?
[8 - 1 `op` 4 + 2 | op <- [lowMult, (*)]]
如果运算符作为参数传递,或者表达式更复杂的结果会怎么样?必须在编译时定义所有运算符的固定性,因此它不能依赖于这样的运行时信息。