Haskell 为什么mod在表达式中给出的结果与在函数调用中不同?

Haskell 为什么mod在表达式中给出的结果与在函数调用中不同?,haskell,modulo,Haskell,Modulo,假设要计算函数: f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2 然后,如果手动展开f(-1,0),则会得到: ((-1 `mod` 3)+(0 `mod` 3)) `mod` 2 1 但是,如果使用内联函数,结果是: let f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2 in f (-1,0) 0 当存储生成的函数不是预期结果时会发生什么 我认为这是因为f使用Integral而不是Int?看起来像是解析的问

假设要计算函数:

f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2
然后,如果手动展开
f(-1,0)
,则会得到:

((-1 `mod` 3)+(0 `mod` 3)) `mod` 2
1
但是,如果使用内联函数,结果是:

let f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2 in f (-1,0)
0
当存储生成的函数不是预期结果时会发生什么


我认为这是因为
f
使用
Integral
而不是
Int

看起来像是解析的问题
-1`mod`3
被解析为
-(1`mod`3)
,而不是
(-1)`mod`3

*Main> -(1 `mod` 3)
-1
*Main> (-1) `mod` 3
2
老实说,一元
-
在Haskell中的工作方式有点让我个人感到困惑。如果我真的需要一个负的文字,我通常只是添加额外的括号来确保


另一个要考虑的是Haskell有两个模函数,即代码> MOD和<代码> REM,它们不同地处理负数。有关更多详细信息,请查看其他问题。

这很奇怪,因为文档似乎表明实验是用负分子进行的。@CommuSoft是的,该页面有点蹩脚。在大多数编程语言中,一元负号可能与变量绑定最多,当然现在为时已晚。但也许他们最好给负号更多的优先级。另一个例子是
-xnegativelerals
,扩展解决了这个问题。@CommuSoft我主张前缀-在Haskell设计时具有不同的优先级,但我被否决了。顺便说一句(事实上与问题密切相关):你不需要所有的paren
mod
自动绑定更紧密(
infixl 7 mod
vs
infixl 6+
)。您可以使用
(-1)`mod`3+0`mod`3)`mod`2
@leftaroundabout:True,添加括号是为了跟踪问题:(。