@@ -3,7 +3,7 @@ module prelude.complex
3import builtins
3import builtins
6−------------------------------ General
6+------------------------------ Rectangular form
9data Complex a = (:+) a a
9data Complex a = (:+) a a
@@ -14,15 +14,35 @@ realPart (r:+i) = r
14imagPart : Complex a -> a
14imagPart : Complex a -> a
15imagPart (r:+i) = i
15imagPart (r:+i) = i
18−------------------------------ Instances
20instance Eq a => Eq (Complex a) where
17instance Eq a => Eq (Complex a) where
21 (==) a b = realPart a == realPart b && imagPart a == imagPart b
18 (==) a b = realPart a == realPart b && imagPart a == imagPart b
23instance Show a => Show (Complex a) where
20instance Show a => Show (Complex a) where
24 show (r:+i) = "("++show r++":+"++show i++")"
21 show (r:+i) = "("++show r++":+"++show i++")"
23+-- We can't do "instance Num a => Num (Complex a)" because
24+-- we need "abs" which needs "magnitude" which needs "sqrt" which needs Float
25+instance Num (Complex Float) where
26+ (+) (a:+b) (c:+d) = ((a+b):+(c+d))
27+ (-) (a:+b) (c:+d) = ((a-b):+(c-d))
28+ (*) (a:+b) (c:+d) = ((a*c-b*d):+(b*c+a*d))
29+ fromInteger x = (fromInteger x:+0)
30+ abs (a:+b) = (magnitude (a:+b):+0)
33+-- when we have a type class 'Fractional' (which contains Float and Double),
36+instance Fractional a => Fractional (Complex a) where
37+ (/) (a:+b) (c:+d) = let
38+ real = (a*c+b*d)/(c*c+d*d)
39+ imag = (b*c-a*d)/(c*c+d*d)
26------------------------------ Polarform
46------------------------------ Polarform
28mkPolar : Float -> Float -> Complex Float
48mkPolar : Float -> Float -> Complex Float