@@ -0,0 +1,65 @@
1+module prelude.complex
2+
3+import builtins
4+
5+
6+------------------------------ Rectangular form
7+
8+infix 6 :+
9+data Complex a = (:+) a a
10+
11+realPart : Complex a -> a
12+realPart (r:+i) = r
13+
14+imagPart : Complex a -> a
15+imagPart (r:+i) = i
16+
17+instance Eq a => Eq (Complex a) where
18+ (==) a b = realPart a == realPart b && imagPart a == imagPart b
19+
20+instance Show a => Show (Complex a) where
21+ show (r:+i) = "("++show r++":+"++show i++")"
22+
23+
24+
25+-- when we have a type class 'Fractional' (which contains Float and Double),
26+-- we can do:
27+{-
28+instance Fractional a => Fractional (Complex a) where
29+ (/) (a:+b) (c:+d) = let
30+ real = (a*c+b*d)/(c*c+d*d)
31+ imag = (b*c-a*d)/(c*c+d*d)
32+ in
33+ (real:+imag)
34+-}
35+
36+
37+
38+------------------------------ Polarform
39+
40+mkPolar : Float -> Float -> Complex Float
41+mkPolar radius angle = radius * cos angle :+ radius * sin angle
42+
43+cis : Float -> Complex Float
44+cis angle = cos angle :+ sin angle
45+
46+magnitude : Complex Float -> Float
47+magnitude (r:+i) = sqrt (r*r+i*i)
48+
49+phase : Complex Float -> Float
50+phase (x:+y) = atan2 y x
51+
52+
53+------------------------------ Conjugate
54+
55+conjugate : Num a => Complex a -> Complex a
56+conjugate (r:+i) = (r :+ (0-i))
57+
58+-- We can't do "instance Num a => Num (Complex a)" because
59+-- we need "abs" which needs "magnitude" which needs "sqrt" which needs Float
60+instance Num (Complex Float) where
61+ (+) (a:+b) (c:+d) = ((a+b):+(c+d))
62+ (-) (a:+b) (c:+d) = ((a-b):+(c-d))
63+ (*) (a:+b) (c:+d) = ((a*c-b*d):+(b*c+a*d))
64+ fromInteger x = (fromInteger x:+0)
65+ abs (a:+b) = (magnitude (a:+b):+0)