[Haskell-cafe] tricky recursive type instance method

Frank Kuehnel vincef13 at mac.com
Fri Jan 28 04:35:31 CET 2011

Hi folks,

how do I make this work: I want a division algebra over a field k, and I want to define
the conjugation of complex numbers, i.e. conj (C 1 2) but also the conjugation of tensors of complex numbers
conj (C (C 1 2) (C 1 4))

ghci load that stuff butt barfs on a simple
> conj (C 1 2)

      instance Real a => DAlgebra a a -- Defined at Clifford.hs:20:10-31
      instance (Real r, Num a, DAlgebra a r) => DAlgebra (Complex a) r

here's the code:

-- for a normed division algebra we need a norm and conjugation!
class DAlgebra a k | a -> k where -- need functional dependence because conj doesn't refer to k
   conj :: a -> a
   abs2 :: a -> k

-- real numbers are a division algebra
instance Real a => DAlgebra a a where
   conj    = id
   abs2 x  = x*x

-- Complex numbers form a normed commutative division algebra
data Complex a = C a a deriving (Eq,Show)

instance Num a => Num (Complex a) where
   fromInteger a = C (fromInteger a) 0
   (C a b)+(C a' b') = C (a+a') (b+b')
   (C a b)-(C a' b') = C (a-a') (b-b')
   (C a b)*(C a' b') = C (a*a'-b*b') (a*b'+b*a')

instance (Real r, Num a, DAlgebra a r) => DAlgebra (Complex a) r where
   conj (C a b)    = C a (conj (-b))
   abs2 (C a b)    = (abs2 a) + (abs2 b)

Thanks for you help!

More information about the Haskell-Cafe mailing list