Haskell中的本地中缀运算符定义

11

在这个Haskell程序中,@@是一个中缀运算符,我希望仅在函数f的主体内部定义它。 (自然而然地,我的实际程序比这更复杂,并且使用中缀表示法有很好的理由。)

infixl 5 @@

(@@) = undefined

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

main = print (f 7)

然而,除非我也进行全局定义,这里写成(@@) = undefined,否则GHC会抱怨“对于@@的结合性签名缺少相应的绑定”。有没有不需要操作符符号的全局定义就可以解决这个问题呢?


1
你的 infixl 5 @@ 是否真正应用于本地的 (@@) 上了?因为我认为那应该是一个 bug。 - jberryman
好像它不是。 - jberryman
1个回答

16

where 子句中加入固定性声明似乎可以正常工作:

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

2
我正要发布这个。根据Haskell 2010报告,将优先级声明放在where块中是100%合法的。令人惊讶,但事实如此。 - MathematicalOrchid
哦,我没有想到那个! - Mike Spivey
我想我没有考虑到这一点,因为作为一个编译器的作者,我不喜欢实现它,或者尝试去做它并在出错时生成合理的错误消息。当然,它是可以完成的,但这是一个需要更多年轻热情的人来完成的工作,而我已经没有那么多的热情了。 - Mike Spivey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接