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

时间:2014-09-17 23:35:59

标签: 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

1 个答案:

答案 0 :(得分:9)

看起来这是一个解析问题。 -1 `mod` 3被解析为-(1 `mod` 3)而不是(-1) `mod` 3

*Main> -(1 `mod` 3)
-1
*Main> (-1) `mod` 3
2

老实说,一元-在Haskell中工作的方式有点像我认为令人困惑的黑客攻击。如果我真的需要一个负面文字,我通常只需添加额外的括号来确定。

另一件需要考虑的事情是Haskell有两个模数函数modrem,它们对负数的处理方式不同。有关详细信息,请查看these two其他问题。