on master help sign in
made some instances of complex numbers.
efc04a3Mekeor Melire
lib/prelude/complex.idr+24−4
@@ -3,7 +3,7 @@ module prelude.complex
3import builtins
3import builtins
4
4
5
5
6−------------------------------ General
6+------------------------------ Rectangular form
7
7
8infix 6 :+
8infix 6 :+
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
16
16
17−
18−------------------------------ Instances
19−
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
22
19
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++")"
25
22
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+
26------------------------------ Polarform
46------------------------------ Polarform
27
47
28mkPolar : Float -> Float -> Complex Float
48mkPolar : Float -> Float -> Complex Float