24

divとの動作に奇妙な矛盾があることがわかりました/

*ghci> :t 1 `div` 0
1 `div` 0 :: Integral a => a
*ghci> :t 1 / 0
1 / 0 :: Fractional a => a
*ghci> 1 / 0
Infinity
*ghci> 1 `div` 0
*** Exception: divide by zero

Infinityゼロによる分数除算が につながるのに対し、div正しくは例外につながることに気づいて、私は非常に驚きました。ANaNは にも受け入れられる可能性があります/が、なぜInfinityですか? このような結果には、数学的な正当化はありません。この理由を教えてください。

4

4 に答える 4

43

div返されない理由Infinityは単純Integerです。型に無限大の表現はありません。

/デフォルトのタイプは。Infinityであるため、IEEE 754標準(浮動小数点数の表現を記述)に準拠しているため、が返されます。浮動小数点数を持つ他の言語(JavaScriptなど)もこの動作を示します。FractionalDouble

数学者をさらにひりひりさせるために、フロートの場合は次のようになりますが、の0で割ると異なる結果が得られます。-0 == 0

Prelude> 1/(-0)
-Infinity

これも標準からの動作です。

のような別の分数型を使用するとRational、期待どおりの動作が得られます。

Prelude> 1 / (0 :: Rational)
*** Exception: Ratio.%: zero denominator

偶然にも、実際の操作でそれらを参照していないのになぜ、問題の型であるのか疑問に思っている場合はInteger、 HaskellがレポートDoubleのデフォルト型(特に数値型)をどのように処理するかを見てください。

短いバージョンでは、Numクラスのタイプがあいまいな場合、Haskellが最初に試行Integerし、次にDoubleそのタイプを試行します。これはステートメントで変更することも、モジュールレベルのステートメントでdefault (Type1, Type2...)オフにすることもできます。default ()

于 2012-02-19T22:52:34.040 に答える
6

これがお役に立てば幸いです。

Prelude> 1/0
Infinity
Prelude> -1/0
-Infinity
Prelude> 0/0
NaN
于 2012-02-19T22:53:05.043 に答える
5

数学的な理由でそうではないかもしれません。Infinityは「sin bin」として使用されることがあります。システムで正常に機能しないものはすべて、そこに入れます。

例:

Prelude> 10 ** 10 ** 10
Infinity

...間違いなく数学的に正当化されません!

于 2012-02-20T00:47:07.967 に答える
3

Fractional はFloat (または Double) 型と等しくありません。

n が 0 になる 1/n の分数なので、lim(n→0) 1/n = +∞、lim(n→0) -1/n = -∞ となり、これは理にかなっています。

于 2012-02-19T23:45:26.627 に答える