default class methods in sub-classes

Zdenek Dvorak rakdver@hotmail.com
Thu, 06 Feb 2003 14:32:55 +0000


Hello,

>Apparently I can't do this (in ghc or hugs -- haven't tried others):
>
>class Space a where
>   distance :: a -> a -> Int
>   subtract :: a -> a -> a
>
>class (Space a) => NormSpace a where
>   norm :: a -> Int
>   distance a b = norm (subtract a b)
>
>That is, I can't make (or redefine) a default for the superclass method
>'distance' in a subclass.  I agree that the Haskell'98 definition doesn't
>claim that this should be allowed, but it seems like something that would 
>be
>useful.  Are there reasons not to allow this (or that I shouldn't want to 
>do
>this at all)?
>
>Apologies if this is well-covered.  I couldn't find any mention of it.

the problem is, that to make something instance of NormSpace, you must first
have it as instance of Space, i.e. with distance already defined. Then for 
this
to work, the default definition in NormSpace would have to override what 
user
defined, which looks strange.

Your problem can be solved in ghc by this (but unfortunately only with
-fallow-overlapping-instances -fallow-undecidable-instances (or some 
simmilar
flags)):

class HavingSubtract a where  -- not sure why generic space should have 
subtract,
  subtract :: a -> a -> a     -- but why not

class (HavingSubtract a) => Space a where
  distance :: a -> a -> Int

class (HavingSubtract a) => NormSpace a where
  norm :: a -> Int

instance (NormSpace a) => Space a where
  distance a b = norm (subtract a b)

(and there is several more examples in that I would find something like this
very useful, but AFAIK there is no clean and elegant way how to do it --
you may do something simmilar using newtypes, but that is totally clumsy).

Zdenek

_________________________________________________________________
The new MSN 8: smart spam protection and 2 months FREE*  
http://join.msn.com/?page=features/junkmail