module Data.Number.Dif(Dif, val, df, mkDif, dCon, dVar, deriv, unDif) where
data Dif a = D !a (Dif a) | C !a
dCon :: (Num a) => a -> Dif a
dCon :: forall a. Num a => a -> Dif a
dCon a
x = forall a. a -> Dif a
C a
x
dVar :: (Num a, Eq a) => a -> Dif a
dVar :: forall a. (Num a, Eq a) => a -> Dif a
dVar a
x = forall a. a -> Dif a -> Dif a
D a
x Dif a
1
df :: (Num a, Eq a) => Dif a -> Dif a
df :: forall a. (Num a, Eq a) => Dif a -> Dif a
df (D a
_ Dif a
x') = Dif a
x'
df (C a
_ ) = Dif a
0
val :: Dif a -> a
val :: forall a. Dif a -> a
val (D a
x Dif a
_) = a
x
val (C a
x ) = a
x
mkDif :: a -> Dif a -> Dif a
mkDif :: forall a. a -> Dif a -> Dif a
mkDif = forall a. a -> Dif a -> Dif a
D
deriv :: (Num a, Num b, Eq a, Eq b) => (Dif a -> Dif b) -> (a -> b)
deriv :: forall a b.
(Num a, Num b, Eq a, Eq b) =>
(Dif a -> Dif b) -> a -> b
deriv Dif a -> Dif b
f = forall a. Dif a -> a
val forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Num a, Eq a) => Dif a -> Dif a
df forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dif a -> Dif b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Num a, Eq a) => a -> Dif a
dVar
unDif :: (Num a, Eq a) => (Dif a -> Dif b) -> (a -> b)
unDif :: forall a b. (Num a, Eq a) => (Dif a -> Dif b) -> a -> b
unDif Dif a -> Dif b
f = forall a. Dif a -> a
val forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dif a -> Dif b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (Num a, Eq a) => a -> Dif a
dVar
instance (Show a) => Show (Dif a) where
show :: Dif a -> String
show Dif a
x = forall a. Show a => a -> String
show (forall a. Dif a -> a
val Dif a
x) forall a. [a] -> [a] -> [a]
++ String
"~~"
instance (Read a) => Read (Dif a) where
readsPrec :: Int -> ReadS (Dif a)
readsPrec Int
p String
s = [(forall a. a -> Dif a
C a
x, String
s') | (a
x, String
s') <- forall a. Read a => Int -> ReadS a
readsPrec Int
p String
s]
instance (Eq a) => Eq (Dif a) where
Dif a
x == :: Dif a -> Dif a -> Bool
== Dif a
y = forall a. Dif a -> a
val Dif a
x forall a. Eq a => a -> a -> Bool
== forall a. Dif a -> a
val Dif a
y
instance (Ord a) => Ord (Dif a) where
Dif a
x compare :: Dif a -> Dif a -> Ordering
`compare` Dif a
y = forall a. Dif a -> a
val Dif a
x forall a. Ord a => a -> a -> Ordering
`compare` forall a. Dif a -> a
val Dif a
y
instance (Num a, Eq a) => Num (Dif a) where
(C a
x) + :: Dif a -> Dif a -> Dif a
+ (C a
y) = forall a. a -> Dif a
C (a
x forall a. Num a => a -> a -> a
+ a
y)
(C a
x) + (D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
+ a
y) Dif a
y'
(D a
x Dif a
x') + (C a
y) = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
+ a
y) Dif a
x'
(D a
x Dif a
x') + (D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
+ a
y) (Dif a
x' forall a. Num a => a -> a -> a
+ Dif a
y')
(C a
x) - :: Dif a -> Dif a -> Dif a
- (C a
y) = forall a. a -> Dif a
C (a
x forall a. Num a => a -> a -> a
- a
y)
(C a
x) - (D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
- a
y) (-Dif a
y')
(D a
x Dif a
x') - (C a
y) = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
- a
y) Dif a
x'
(D a
x Dif a
x') - (D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
- a
y) (Dif a
x' forall a. Num a => a -> a -> a
- Dif a
y')
(C a
0) * :: Dif a -> Dif a -> Dif a
* Dif a
_ = forall a. a -> Dif a
C a
0
Dif a
_ * (C a
0) = forall a. a -> Dif a
C a
0
(C a
x) * (C a
y) = forall a. a -> Dif a
C (a
x forall a. Num a => a -> a -> a
* a
y)
p :: Dif a
p@(C a
x) * (D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
* a
y) (Dif a
p forall a. Num a => a -> a -> a
* Dif a
y')
(D a
x Dif a
x') * q :: Dif a
q@(C a
y) = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
* a
y) (Dif a
x' forall a. Num a => a -> a -> a
* Dif a
q)
p :: Dif a
p@(D a
x Dif a
x') * q :: Dif a
q@(D a
y Dif a
y') = forall a. a -> Dif a -> Dif a
D (a
x forall a. Num a => a -> a -> a
* a
y) (Dif a
x' forall a. Num a => a -> a -> a
* Dif a
q forall a. Num a => a -> a -> a
+ Dif a
p forall a. Num a => a -> a -> a
* Dif a
y')
negate :: Dif a -> Dif a
negate (C a
x) = forall a. a -> Dif a
C (forall a. Num a => a -> a
negate a
x)
negate (D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Num a => a -> a
negate a
x) (forall a. Num a => a -> a
negate Dif a
x')
fromInteger :: Integer -> Dif a
fromInteger Integer
i = forall a. a -> Dif a
C (forall a. Num a => Integer -> a
fromInteger Integer
i)
abs :: Dif a -> Dif a
abs (C a
x) = forall a. a -> Dif a
C (forall a. Num a => a -> a
abs a
x)
abs p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Num a => a -> a
abs a
x) (forall a. Num a => a -> a
signum Dif a
p forall a. Num a => a -> a -> a
* Dif a
x')
signum :: Dif a -> Dif a
signum (C a
x) = forall a. a -> Dif a
C (forall a. Num a => a -> a
signum a
x)
signum (D a
x Dif a
_) = forall a. a -> Dif a
C (forall a. Num a => a -> a
signum a
x)
instance (Fractional a, Eq a) => Fractional (Dif a) where
recip :: Dif a -> Dif a
recip (C a
x) = forall a. a -> Dif a
C (forall a. Fractional a => a -> a
recip a
x)
recip (D a
x Dif a
x') = Dif a
ip
where ip :: Dif a
ip = forall a. a -> Dif a -> Dif a
D (forall a. Fractional a => a -> a
recip a
x) (-Dif a
x' forall a. Num a => a -> a -> a
* Dif a
ip forall a. Num a => a -> a -> a
* Dif a
ip)
fromRational :: Rational -> Dif a
fromRational Rational
r = forall a. a -> Dif a
C (forall a. Fractional a => Rational -> a
fromRational Rational
r)
lift :: (Num a, Eq a) => [a -> a] -> Dif a -> Dif a
lift :: forall a. (Num a, Eq a) => [a -> a] -> Dif a -> Dif a
lift (a -> a
f : [a -> a]
_) (C a
x) = forall a. a -> Dif a
C (a -> a
f a
x)
lift (a -> a
f : [a -> a]
f') p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (a -> a
f a
x) (Dif a
x' forall a. Num a => a -> a -> a
* forall a. (Num a, Eq a) => [a -> a] -> Dif a -> Dif a
lift [a -> a]
f' Dif a
p)
lift [a -> a]
_ Dif a
_ = forall a. HasCallStack => String -> a
error String
"lift"
instance (Floating a, Eq a) => Floating (Dif a) where
pi :: Dif a
pi = forall a. a -> Dif a
C forall a. Floating a => a
pi
exp :: Dif a -> Dif a
exp (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
exp a
x)
exp (D a
x Dif a
x') = Dif a
r where r :: Dif a
r = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
exp a
x) (Dif a
x' forall a. Num a => a -> a -> a
* Dif a
r)
log :: Dif a -> Dif a
log (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
log a
x)
log p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
log a
x) (Dif a
x' forall a. Fractional a => a -> a -> a
/ Dif a
p)
sqrt :: Dif a -> Dif a
sqrt (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
sqrt a
x)
sqrt (D a
x Dif a
x') = Dif a
r where r :: Dif a
r = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
sqrt a
x) (Dif a
x' forall a. Fractional a => a -> a -> a
/ (Dif a
2 forall a. Num a => a -> a -> a
* Dif a
r))
sin :: Dif a -> Dif a
sin = forall a. (Num a, Eq a) => [a -> a] -> Dif a -> Dif a
lift (forall a. [a] -> [a]
cycle [forall a. Floating a => a -> a
sin, forall a. Floating a => a -> a
cos, forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Floating a => a -> a
sin, forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Floating a => a -> a
cos])
cos :: Dif a -> Dif a
cos = forall a. (Num a, Eq a) => [a -> a] -> Dif a -> Dif a
lift (forall a. [a] -> [a]
cycle [forall a. Floating a => a -> a
cos, forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Floating a => a -> a
sin, forall a. Num a => a -> a
negate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Floating a => a -> a
cos, forall a. Floating a => a -> a
sin])
acos :: Dif a -> Dif a
acos (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
acos a
x)
acos p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
acos a
x) (-Dif a
x' forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt(Dif a
1 forall a. Num a => a -> a -> a
- Dif a
pforall a. Num a => a -> a -> a
*Dif a
p))
asin :: Dif a -> Dif a
asin (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
asin a
x)
asin p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
asin a
x) ( Dif a
x' forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sqrt(Dif a
1 forall a. Num a => a -> a -> a
- Dif a
pforall a. Num a => a -> a -> a
*Dif a
p))
atan :: Dif a -> Dif a
atan (C a
x) = forall a. a -> Dif a
C (forall a. Floating a => a -> a
atan a
x)
atan p :: Dif a
p@(D a
x Dif a
x') = forall a. a -> Dif a -> Dif a
D (forall a. Floating a => a -> a
atan a
x) ( Dif a
x' forall a. Fractional a => a -> a -> a
/ (Dif a
pforall a. Num a => a -> a -> a
*Dif a
p forall a. Num a => a -> a -> a
- Dif a
1))
sinh :: Dif a -> Dif a
sinh Dif a
x = (forall a. Floating a => a -> a
exp Dif a
x forall a. Num a => a -> a -> a
- forall a. Floating a => a -> a
exp (-Dif a
x)) forall a. Fractional a => a -> a -> a
/ Dif a
2
cosh :: Dif a -> Dif a
cosh Dif a
x = (forall a. Floating a => a -> a
exp Dif a
x forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
exp (-Dif a
x)) forall a. Fractional a => a -> a -> a
/ Dif a
2
asinh :: Dif a -> Dif a
asinh Dif a
x = forall a. Floating a => a -> a
log (Dif a
x forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt (Dif a
xforall a. Num a => a -> a -> a
*Dif a
x forall a. Num a => a -> a -> a
+ Dif a
1))
acosh :: Dif a -> Dif a
acosh Dif a
x = forall a. Floating a => a -> a
log (Dif a
x forall a. Num a => a -> a -> a
+ forall a. Floating a => a -> a
sqrt (Dif a
xforall a. Num a => a -> a -> a
*Dif a
x forall a. Num a => a -> a -> a
- Dif a
1))
atanh :: Dif a -> Dif a
atanh Dif a
x = (forall a. Floating a => a -> a
log (Dif a
1 forall a. Num a => a -> a -> a
+ Dif a
x) forall a. Num a => a -> a -> a
- forall a. Floating a => a -> a
log (Dif a
1 forall a. Num a => a -> a -> a
- Dif a
x)) forall a. Fractional a => a -> a -> a
/ Dif a
2
instance (Real a) => Real (Dif a) where
toRational :: Dif a -> Rational
toRational = forall a. Real a => a -> Rational
toRational forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
instance (RealFrac a) => RealFrac (Dif a) where
properFraction :: forall b. Integral b => Dif a -> (b, Dif a)
properFraction Dif a
x = (b
i, Dif a
x forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral b
i) where (b
i, a
_) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction (forall a. Dif a -> a
val Dif a
x)
truncate :: forall b. Integral b => Dif a -> b
truncate = forall a b. (RealFrac a, Integral b) => a -> b
truncate forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
round :: forall b. Integral b => Dif a -> b
round = forall a b. (RealFrac a, Integral b) => a -> b
round forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
ceiling :: forall b. Integral b => Dif a -> b
ceiling = forall a b. (RealFrac a, Integral b) => a -> b
ceiling forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
floor :: forall b. Integral b => Dif a -> b
floor = forall a b. (RealFrac a, Integral b) => a -> b
floor forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
instance (RealFloat a) => RealFloat (Dif a) where
floatRadix :: Dif a -> Integer
floatRadix = forall a. RealFloat a => a -> Integer
floatRadix forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
floatDigits :: Dif a -> Int
floatDigits = forall a. RealFloat a => a -> Int
floatDigits forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
floatRange :: Dif a -> (Int, Int)
floatRange = forall a. RealFloat a => a -> (Int, Int)
floatRange forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
exponent :: Dif a -> Int
exponent Dif a
_ = Int
0
scaleFloat :: Int -> Dif a -> Dif a
scaleFloat Int
0 Dif a
x = Dif a
x
isNaN :: Dif a -> Bool
isNaN = forall a. RealFloat a => a -> Bool
isNaN forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
isInfinite :: Dif a -> Bool
isInfinite = forall a. RealFloat a => a -> Bool
isInfinite forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
isDenormalized :: Dif a -> Bool
isDenormalized = forall a. RealFloat a => a -> Bool
isDenormalized forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
isNegativeZero :: Dif a -> Bool
isNegativeZero = forall a. RealFloat a => a -> Bool
isNegativeZero forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
isIEEE :: Dif a -> Bool
isIEEE = forall a. RealFloat a => a -> Bool
isIEEE forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Dif a -> a
val
decodeFloat :: Dif a -> (Integer, Int)
decodeFloat = forall a. HasCallStack => a
undefined
encodeFloat :: Integer -> Int -> Dif a
encodeFloat = forall a. HasCallStack => a
undefined