packages feed

entangle-0.1.0: src/lib/Complex.hs

module Complex (Complex((:+)), ii) where

-- This module is similar to Data.Complex, but with lighter constraints

infix  6  :+

data Complex a = a :+ a

ii :: Num a => Complex a
ii = 0 :+ 1

instance Num a => Num (Complex a) where
    (a :+ b) + (c :+ d) = (a + c) :+ (b + d)
    (a :+ b) - (c :+ d) = (a - c) :+ (b - d)
    (a :+ b) * (c :+ d) = (a * c - b * d) :+ (b * c + a * d)
    fromInteger n = fromInteger n :+ 0
    abs = error "abs not implemented because it would need a Floating instance for the type variable"
    signum = error "signum makes no sense for complex numbers"

instance Fractional a => Fractional (Complex a) where
    recip (a :+ b) =
        let
            d = a * a + b * b
            rp = a / d
            ip = -1 * b / d
        in
            rp :+ ip
    fromRational r = fromRational r :+ 0

instance Floating a => Floating (Complex a) where
    sqrt z =
        let
            r = aabs z
            rc = r :+ 0
            aabs (a :+ b) = sqrt (a * a + b * b)
        in
            (sqrt r :+ 0) * (z + rc) / (aabs (z + rc) :+ 0)

    pi = error "pi"

    log = error "log not implemented"
    exp = error "exp not implemented"

    tan = error "tan not implemented"
    atan = error "atan not implemented"
    atanh = error "atanh not implemented"

    sin = error "sin not implemented"
    asin = error "asin not implemented"
    sinh = error "sinh not implemented"
    asinh = error "asinh not implemented"

    cos = error "cos not implemented"
    acos = error "acos not implemented"
    cosh = error "cosh not implemented"
    acosh = error "acosh not implemented"

instance (Show a, Eq a, Num a) => Show (Complex a) where
    show (a :+ b)
        | b == 0    = show a
        | a == 0    =                  show b ++ "i"
        | otherwise = show a ++ "+" ++ show b ++ "i"