2011-11-13 93 views
46

類型類Integral有兩個操作quotdiv,但在Haskell 2010語言報告中沒有指定它們應該執行的操作。假設div是整數除法,quotquot有什麼不同?你什麼時候使用一個,什麼時候使用另一個?積分運算符與div對齊

+1

這似乎是一個很有前途的鏈接:http://cdsmith.wordpress.com/2007/06/02/learning-number-theory-and-haskell-the-division-algorithm/ –

回答

88

要從Haskell的報告中引用部分6.4.2:

quotremdiv,和mod類方法滿足這些法律如果y爲非零:

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

quot是整數劃分向零截斷,而div的結果被截斷爲負無窮。

div函數通常是更自然的函數,而quot函數對應於現代機器上的機器指令,因此效率更高。

+4

+1討論什麼時候你可能比另一個 –

+16

更喜歡一個,或者相當於'mod'的結果與除數的符號相同,而'rem'的結果與股息具有相同的標記 – newacct

+0

感謝您的回答,特別是提及HR中的段落。我只在第9章看過。 – Ingo

26

當處理負數時,兩者表現不同。試想一下:

Hugs> (-20) `divMod` 3 
(-7,1) 
Hugs> (-20) `quotRem` 3 
(-6,-2) 

這裏,-7 * 3 + 1 = -20-6 * 3 + (-2) = -20,但兩種方法給你不同的答案。

另外,在這裏看到:http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html

quot的定義是「整數除法朝向零截斷」,而對於div的定義是「整數除法向負無窮截斷」。

+1

你知道,還有' divMod'和'quotRem' ... – fuz