# [Haskell-cafe] tricky recursive type instance method

Steffen Schuldenzucker sschuldenzucker at uni-bonn.de
Fri Jan 28 08:51:47 CET 2011

```Hi,

you might want to take a look at AdvancedOverlap.

However, the most simple option would be to wrap up your (Real a =>
DAlgebra a a) instance in a newtype:

> {-# LANGUAGE GeneralizedNewtypeDeriving #-}
>
> newtype FromReal a = FromReal a deriving (Eq, Ord, Read, Show, Num, Real)
>
>instance Real a => DAlgebra (FromReal a) (FromReal a) where
>   conj    = id
>   abs2 x  = x*x

Steffen

On 01/28/2011 04:35 AM, Frank Kuehnel wrote:
> 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)
>>
> with
>        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!
>
> _______________________________________________