
"Jacques Carette"
ajb@spamcop.net wrote:
"Eq" is not merely a function of type a -> a -> Bool. It's a concept with semantics. It must be an equivalence relation, and it also must mean semantic equality. Functions that respect semantic equality have the property that x == y implies f x == f y. (No, none of these restrictions are in the language report. But I'd be annoyed if someone defined a version of Eq that didn't have these properties.)
From what you argue above, and reading the IEEE 754 standard correctly, instance Eq Float and instance Eq Double should be *removed* !
For me this indicates that the above is false. It's almost true but not strictly true. It's like the fact that "m >>= return" is the same as m. This almost holds, except for some monads when m is bottom. It doesn't mean that instance Monad IO should be removed, but that the real world is not as ideal as our models suggest. Removing instance Eq Double would force removing instances for Ord, Num and all other numeric classes, which is unnacceptable. There would be no instances of Floating left. BTW, OCaml recently removed pointer equality check from its implementation of structural equality, because this caused inconsistent results for floats which depended on optimization (a NaN was equal to itself or not depending on whether the compiler knew the type statically or called the general polymorphic equality function). -- __("< Marcin Kowalczyk \__/ qrczak@knm.org.pl ^^ http://qrnik.knm.org.pl/~qrczak/