[haskell] Haskell에서`mod`와`rem`의 차이점

하스켈 mod과 의 차이점은 정확히 무엇입니까 rem?

둘 다 같은 결과를주는 것 같습니다

*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



답변

두 번째 주장이 부정적 일 때는 동일하지 않습니다.

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2


답변

예, 이러한 기능은 다르게 작동합니다. 공식 문서에 정의 된대로 :

quot 정수 나누기는 0으로 잘립니다.

rem 정수 나머지, 만족 :

(x `quot` y)*y + (x `rem` y) == x

div 음의 무한대로 잘린 정수 나누기

mod 정수 계수이며 다음을 만족합니다.

(x `div` y)*y + (x `mod` y) == x

음수를 두 번째 매개 변수로 사용하고 결과가 0이 아닌 경우 실제로 차이를 알 수 있습니다.

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

 


답변

실제로 말하기 :

당신은 두 피연산자가 모두 긍정적 알고 있다면, 당신은 일반적으로 사용한다 quot, rem또는 quotRem효율성.

두 피연산자가 모두 양수인지 모르는 경우 결과의 모양을 생각해야합니다. 당신은 아마 원하지 quotRem않지만, 당신도 원하지 않을 수도 divMod있습니다. 이 (x `div` y)*y + (x `mod` y) == x법은 매우 좋은 법이지만 음의 무한대로 반올림하는 구분 (Knuth style division)은이를 보장하는 것 0 <= x `mod` y < y(유클리드 분할) 보다 덜 유용하고 덜 효율적 입니다.


답변

분할 성만 테스트하려는 경우 항상을 사용해야 rem합니다.

기본적 x `mod` y == 0으로와 x `rem` y == 0같지만 rem보다 빠릅니다 mod.


답변