Gaussian Integers
Janis Voigtlaender
voigt@orchid.inf.tu-dresden.de
Tue, 19 Mar 2002 12:46:43 +0100
dominic.j.steinitz@britishairways.com wrote:
> I've already declared Gaussian a as being of class Eq so why does it need
> to be told again?
>
> data Integral a => Gaussian a = Gaussian a a
> deriving (Eq, Show)
>
> instance Num (Gaussian a) where
> Gaussian a b - Gaussian a' b' = Gaussian (a-a') (b-b')
> Gaussian a b + Gaussian a' b' = Gaussian (a+a') (b+b')
> Gaussian a b * Gaussian a' b' = Gaussian (a*a' - b*b') (a*b' + b*a')
> negate (Gaussian a b) = Gaussian (negate a) (negate b)
> fromInteger a = Gaussian (fromIntegral a) 0
You have only declared Gaussian a as being of class Eq (by deriving) if
"a" is of class Integral (as a context in the data declaration). Adding
Integral a to your instance should fix the problem:
instance Integral a => Num (Gaussian a) where
Gaussian a b - Gaussian a' b' = Gaussian (a-a') (b-b')
Gaussian a b + Gaussian a' b' = Gaussian (a+a') (b+b')
Gaussian a b * Gaussian a' b' = Gaussian (a*a' - b*b') (a*b' + b*a')
negate (Gaussian a b) = Gaussian (negate a) (negate b)
fromInteger a = Gaussian (fromIntegral a) 0
--
Janis Voigtlaender
http://wwwtcs.inf.tu-dresden.de/~voigt/
mailto:voigt@tcs.inf.tu-dresden.de