假设有人想要计算函数:
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
uses Integral
代替Int
?
看起来这是一个解析的问题。-1 `mod` 3
被解析为-(1 `mod` 3)
并不是(-1) `mod` 3
.
*Main> -(1 `mod` 3)
-1
*Main> (-1) `mod` 3
2
老实说,一元的方式-
在 Haskell 中工作是一种我个人觉得令人困惑的黑客行为。如果我确实需要负数,我通常只需添加额外的括号即可确定。
另一件需要考虑的事情是 Haskell 有two模函数,mod
and rem
,以不同的方式对待负数。欲了解更多详情,请查看these https://stackoverflow.com/questions/8111120/integral-operators-quot-vs-div/8111203#8111203 two https://stackoverflow.com/questions/339719/when-is-the-difference-between-quotrem-and-divmod-useful/339823#339823其他问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)