【问题标题】:Local infix operator definition in HaskellHaskell 中的局部中缀运算符定义
【发布时间】:2017-01-05 16:14:36
【问题描述】:

在这个 Haskell 程序中,@@ 是一个中缀运算符,我只想在函数 f 的主体内本地定义它。 (当然,我的实际程序比这更复杂,使用中缀表示法是有充分理由的。)

infixl 5 @@

(@@) = undefined

f x = x @@ 5 where x @@ y = (x+1) * (y+1)

main = print (f 7)

但是,除非我也进行全局定义,这里写为 (@@) = undefined,否则 GHC 会抱怨“@@ 的固定性签名缺少随附的绑定。”如果没有运算符符号的全局定义,有没有办法解决这个问题?

【问题讨论】:

  • 你的infixl 5 @@真的被应用到本地的(@@)了吗?因为那应该是我认为的错误
  • 好像不是

标签: haskell


【解决方案1】:

将固定性声明放在​​where 子句中似乎可以正常工作:

f x = x @@ 5 where
    infixl 5 @@
    x @@ y = (x+1) * (y+1)

【讨论】:

  • 我正要发布这个。根据 Haskell 2010 报告,将固定性声明放在​​ where-block 中是 100% 合法的。令人惊讶,但真实。
  • 哦,我没想到!
  • ... 我想我没有想到它,因为作为编译器编写者,我不想实现它,或者尝试这样做并在出错时生成合理的错误消息。当然可以,但对于比我更年轻的人​​来说,这是一份工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多