【问题标题】:Why does mod give a different result in an expression than in a function call?为什么 mod 在表达式中的结果与在函数调用中的结果不同?
【发布时间】:2014-09-17 23:35:58
【问题描述】:

说要计算函数:

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

【问题讨论】:

  • 顺便说一句(实际上与问题密切相关):您不需要所有这些括号; mod 自动绑定得更紧密(infixl 7 modinfixl 6 +)。 ((-1)`mod`3 + 0`mod`3) `mod` 2 你会没事的。
  • @leftaroundabout: 是的,添加括号是为了追查问题:(.

标签: haskell modulo


【解决方案1】:

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

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

老实说,一元 - 在 Haskell 中的工作方式有点让我感到困惑。如果我真的需要一个否定的文字,我通常只是添加额外的括号来确定。

要考虑的另一件事是 Haskell 有 两个 模函数,modrem,它们以不同的方式处理负数。更多详情,请查看thesetwo其他问题。

【讨论】:

  • 这很奇怪,因为文档 here 似乎建议使用负分子进行实验。
  • @CommuSoft 是的,那个页面有点蹩脚。
  • 在大多数编程语言中,一元减号可能最多绑定到变量,当然现在为时已晚。但也许他们最好优先考虑减号。
  • -XNegativeLiterals 的另一点,该扩展解决了问题。
  • @CommuSoft 我主张前缀——在设计 Haskell 时具有不同的优先级,但我被否决了。
猜你喜欢
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多