2011-11-13 6 views
46

タイプクラスIntegralには2つの演算quotdivがありますが、Haskell 2010言語レポートでは、それらの演算が指定されていません。 divが整数除算であると仮定すると、quotはどういう意味がありますか、またはquotの目的は何ですか?あなたはいつ使うのですか?整数演算子quot vs div

+1

これは有望なリンクのようです:http://cdsmith.wordpress.com/2007/06/02/learning-number-theory-and-haskell-the-division-algorithm/ –

答えて

88

除算は0に向かって切り捨てられ、divの結果は負の無限大に切り捨てられます。

div機能は、より自然なものであることが多いのに対し、quot機能は、最新のマシンのマシン命令に対応しているため、やや効率的です。

+4

+1のどちらか一方が好きかもしれないときの議論のためには、 –

+16

、またはそれと同等に、' mod'の結果は除数と同じ符号を持ち、 'rem'配当と同じ符号を持っています – newacct

+0

答えのおかげで、特にHRのパラグラフに言及してください。私は第9章だけを見ていた。 – Ingo

26

負の数を扱うときは、2つの動作が異なります。考えてみましょう:

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

-7 * 3 + 1 = -20-6 * 3 + (-2) = -20が、2つの方法があなたに別の答えを与えるが。

また、ここで参照:http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html

quotの定義があるdivの定義があるのに対し、「整数の除算は負の無限大に向かって切り捨て」、「整数除算はゼロに向かって切り捨て」。

yがゼロでない場合quotremdiv、及びmodクラスメソッドは、これらの法則を満たす:

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

quotは整数でHaskellのレポートからセクション6.4.2を引用する

+1

あなたは知っている、 divMod'と 'quotRem' ... – fuz

関連する問題