【发布时间】:2020-08-07 14:52:03
【问题描述】:
Haskell 中的 rem 的行为与 JavaScript 中的 % 类似。当使用时钟类比 rem 时,无论值是正数还是负数,总是顺时针方向。 rem 带分号
divident / divisor = quotient
Prelude> 10 `rem` 3
1
Prelude> -10 `rem` 3
-1
% 在 JavaScript 中的工作方式相同
$ node
> 10 % 3
1
> -10 % 3
-1
mod 的行为类似于rem,当两个值都为正时。唯一的区别是,当其中一个数字为负时,mod 在时钟上倒退,而不是顺时针方向并取除数的符号。
知道mod 和rem 在两个数字都为正数时给出相同的结果,建议在Haskell 中使用哪一个?
【问题讨论】:
-
mod是根据divMod定义的defined,它是根据quotRem定义的。rem是根据quotRem定义的,所以它的函数调用少了一个。 -
请注意
-10 `rem` 3被解析为- (10`rem`3)。这实际上并没有改变问题,但这意味着-10 `mod` 3确实也 给出-1作为结果,而(-10)`mod`3给出2作为结果。 -
另请注意,JavaScript 从 C 继承了
%的这种行为,这可能更相关。 (同时,例如在 Python 中,%运算符的行为类似于 Haskell 的mod。) -
如果您知道这两个数字都是正数,请使用 rem,因为这是现代处理器上的指令(我只记得 NS32k 也为 mod 提供了指令)。
标签: haskell