Difference between `mod` and `rem` in Haskell
haskell的mod和rem到底有什么区别?
两个结果似乎都一样
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | *Main> mod 2 3
2
* Main> rem 2 3
2
* Main> mod 10 5
0
* Main> rem 10 5
0
* Main> mod 1 0
***  Exception:  divide by zero
* Main> rem 1 0
***  Exception:  divide by zero
* Main> mod 1 (-1)
0
* Main> rem 1 (-1)
0 | 
		
		
- 不知道哈斯克尔,但可能是同一个手术。modulus==remainder.
- 公平地说,这不是同一个问题。另一个问题假定理解了这个问题的答案。
- @丹读了那个问题,因为我有另一个问题(stackoverflow.com/questions/5892188/…),我意识到了同样的问题:/
- 这与div和quot的区别相同。
 
	 
当第二个论点是否定的时候,它们就不一样了:
| 12
 
 | 2 `mod ` (-3)  ==  -1
2  `rem ` (-3)  ==  2 | 
		
		
- 我对clojure的rem和mod也有同样的问题,这就是答案。
- 当第一个论点是否定的时候,它们也不相同。有关这些棘手操作的更多信息,请参阅stackoverflow.com/a/8111203/1535283和stackoverflow.com/a/339823/1535283。
- 同样,从stackoverflow.com/a/6964760/205521看来,rem是最快的。
- 虽然这个答案是正确的,但对于一个问题"有什么区别"来说,一个声称"不相同"的答案是非常糟糕的。如果您能扩展"如何"它们是不同的,并且可能是一些用例,我会欢迎它。
 
	 
是的,这些功能的作用是不同的。如官方文件所定义:
quot是整数除法,截断为零。
rem为整数余数,满足:
div是整数除法,被截断为负无穷大。
mod为整数模,满足:
| 1
 | (x `div ` y)* y + ( x `mod ` y) ==  x | 
当使用负数作为第二个参数且结果不是零时,您可以真正注意到差异:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | 5 `mod ` 3 == 2
5  `rem ` 3 == 2
5  `mod ` (-3) == -1
5  `rem ` (-3) == 2
(-5)  `mod ` 3 == 1
(-5)  `rem ` 3 == -2
(-5)  `mod ` (-3) == -2
(-5)  `rem ` (-3) == -2 | 
nbsp;
		
		
- 你最后的四个例子可能不是你的意思,因为mod和rem比(-)的关联更强烈。我已经编辑了你的评论,因为我似乎不能在这个评论中放多行内容。
- @Erikhesslink:您在编辑时引入了一个错误。(-5) `mod` 3 == 1
- @承孙谢谢,我已经修好了。应该是审查后的生活。
 
	 
实际上:
如果你知道两个操作数都是正的,你通常应该使用quot、rem或quotRem来提高效率。
如果你不知道两个操作数都是正的,你必须考虑一下你想要的结果是什么样子的。你可能不想要quotRem,但也可能不想要divMod。(x `div` y)*y + (x `mod` y) == x定律是一个很好的定律,但是向负无穷(knuth样式的除法)的四舍五入除法通常不如确保0 <= x `mod` y < y除法(欧几里得除法)有用且效率低。
如果您只想测试可分割性,那么应该始终使用rem。
本质上,x `mod` y == 0相当于x `rem` y == 0,但rem比mod快。