
On Jan 16, 2008 11:30 PM, Derek Elkins
For the love of Pete, floating point numbers are not real numbers. 0/0 is mathematically defined for floating point numbers to be NaN. If you don't want to use IEEE floating point numbers, use a different type as was suggested early in this thread.
In fact, you can be happy just by using Rational Prelude> 0/0 :: Rational *** Exception: Ratio.%: zero denominator or creating a newtype newtype ZeroUndef a = Z {unZ :: a} instance Eq a => Eq (ZeroUndef a) where Z a == Z b = a == b Z a /= Z b = a /= b instance Show a => Show (ZeroUndef a) where ... instance Num a => Num (ZeroUndef a) where ... instance Fractional a => Fractional (ZeroUndef a) where ... Z a / Z 0 = error "..." Z a / Z b = Z (a / b) .... so that ZeroUndef Double, ZeroUndef Float, ZeroUndef Matrix and all friends do work like you want. -- Felipe.