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
div
が正しく例外につながる一方で私は、ゼロによる分数の割り算はInfinity
につながることに気づくのは非常に驚きました。 /
の場合はNaN
でも問題はありませんが、なぜInfinity
?そのような結果には数学的正当性はない。あなたはこの理由を知っていますか?
「1/0」の結果を「無限大」にすることは数学的に完全に正当化されています。これは唯一の正当な戻り値ではありませんが、最も理にかなったものです。 '1/0 :: Rational'を評価すると、' divide by zero'というエラーも出ることに注意してください。 –
@ダニエルフィッシャー:この種のコンパクト化(正と負の無限大を持つ)はholdを保持するかなり多くの定理を破壊し、それらのいくつかは多くのプログラムで想定されるため、「数学的に完全に正当化された」とは言いません。 – leftaroundabout
浮動小数点数を使って作業するときは、そのようなものを想定するべきではありません。連想性のような基本的な性質さえも必ずしも成立しません。平等は 'NaN'にとっても反射的ではありません! –