【问题标题】:Why infix operators lose their fixities in let/do bindings为什么中缀运算符在 let/do 绑定中失去固定性
【发布时间】:2013-08-18 13:20:19
【问题描述】:

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

【问题讨论】:

  • 你好像有两个函数:lowMultlowM
  • 是的,我首先将它命名为lowM,但最后带有大写M的函数专门用于单子函数,我没有进行所有更改,谢谢

标签: haskell


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好吧,没关系,这只是尝试生成 a.b.c.d 形式的所有算术表达式。在 (*,-,+,/) 中并带有括号
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2011-11-16
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多