@@ -3,7 +3,7 @@ module prelude.complex
33import builtins
44
55
6−------------------------------ General
6+------------------------------ Rectangular form
77
88infix 6 :+
99data Complex a = (:+) a a
@@ -14,15 +14,35 @@ realPart (r:+i) = r
1414imagPart : Complex a -> a
1515imagPart (r:+i) = i
1616
17−
18−------------------------------ Instances
19−
2017instance Eq a => Eq (Complex a) where
2118 (==) a b = realPart a == realPart b && imagPart a == imagPart b
2219
2320instance Show a => Show (Complex a) where
2421 show (r:+i) = "("++show r++":+"++show i++")"
2522
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)
31+
32+
33+-- when we have a type class 'Fractional' (which contains Float and Double),
34+-- we can do:
35+{-
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)
40+ in
41+ (real:+imag)
42+-}
43+
44+
45+
2646------------------------------ Polarform
2747
2848mkPolar : Float -> Float -> Complex Float