Keean Schupke wrote:
There are problems with this approach...

instance (Ord a, Num a) => ApproxEq a where x ~= y = (abs (x-y) < 1)

However it should do what you want with just -foverlapping-instances -fundecidable-instances.

Only -fallow-incoherent-instances allowes to resolve

 3.5 ~= 2.6

without type-annotations! But when adding:

 instance ApproxEq Double where x~=y = False

the above result remained True (via Defaulting) whereas

3.5 ~= (2.6 :: Double)

became False. (An the other hand there was no need to add such an instance for Double.)

It is also not possible to add a further instance like:

 instance (Ord a, Fractional a) => ApproxEq a where
   x ~= y = (abs (x-y) < 0.1)

(hoping that fractionals are treated more accurate that nums) Only one instance for "ApproxEq a" is allowed.

Since the subject is "New to haskell" I recommend to stay Haskell98 compliant, i.e. avoid overlapping instances and add type signatures as necessary.

If you add the option -Wall (or -fwarn-type-defaults) to ghci you'll get a warning whenever "defaulting" occurs (like in 1.5 == 1.5 to Double)

(Putting "default ()" in your source file prevents defaulting, but I don't recommend to do so only to force types on decls like "f = 1.5")

Christian
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to