11 | interface Num a => Exp a where
20 | minusInfinity = cast "-inf.0"
23 | interface Num a => Sqrt a where
33 | {n : Nat} -> Num a => Num (Vect n a) where
34 | xs + ys = zipWith (+) xs ys
35 | xs * ys = zipWith (*) xs ys
36 | fromInteger x = replicate n (fromInteger x)
45 | Num a => Num b => Num (a, b) where
46 | (lFst, lSnd) * (rFst, rSnd) = (lFst * rFst, lSnd * rSnd)
47 | (+) (lFst, lSnd) (rFst, rSnd) = (lFst + rFst, lSnd + rSnd)
48 | fromInteger x = (fromInteger x, fromInteger x)
51 | Num a => Num b => Num (DPair a (const b)) where
52 | (
lFst ** lSnd)
* (
rFst ** rSnd)
= (
lFst * rFst ** lSnd * rSnd)
53 | (+) (
lFst ** lSnd) (
rFst ** rSnd)
= (
lFst + rFst ** lSnd + rSnd)
54 | fromInteger x = (
fromInteger x ** fromInteger x)
58 | depFunNum : {k : Fin n -> Type} ->
59 | {ss : (i : Fin n) -> Num (k i)} ->
60 | Num ((i : Fin n) -> k i)
62 | (\s, t => \i => s i + t i)
63 | (\f, g => \i => f i * g i)
64 | (\n => \i => fromInteger n)
75 | Neg a => Neg b => Neg (a, b) where
76 | negate (lFst, lSnd) = (negate lFst, negate lSnd)
77 | (lFst, lSnd) - (rFst, rSnd) = (lFst - rFst, lSnd - rSnd)
80 | Neg a => Neg b => Neg (DPair a (const b)) where
81 | negate (
fst ** snd)
= (
negate fst ** negate snd)
82 | (
fst ** snd)
- (
rFst ** rSnd)
= (
fst - rFst ** snd - rSnd)
86 | depFunNeg : {k : Fin n -> Type} ->
87 | {ss : (i : Fin n) -> Neg (k i)} ->
88 | Neg ((i : Fin n) -> k i)
90 | (\s => \i => negate (s i))
91 | (\f, g => \i => f i - g i)
93 | namespace FromDouble
95 | FromDouble Unit where
99 | FromDouble a => FromDouble b => FromDouble (a, b) where
100 | fromDouble x = (fromDouble x, fromDouble x)
103 | FromDouble a => FromDouble b => FromDouble (DPair a (const b)) where
104 | fromDouble x = (
fromDouble x ** fromDouble x)
108 | depFunFromDouble : {k : Fin n -> Type} ->
109 | {ss : (i : Fin n) -> FromDouble (k i)} ->
110 | FromDouble ((i : Fin n) -> k i)
111 | depFunFromDouble = MkFromDouble
112 | (\s => \i => fromDouble s)
114 | namespace Fractional
116 | Fractional Unit where
120 | Fractional a => Fractional b => Fractional (a, b) where
121 | (lFst, lSnd) / (rFst, rSnd) = (lFst / rFst, lSnd / rSnd)
124 | Fractional a => Fractional b => Fractional (DPair a (const b)) where
125 | (
fst ** snd)
/ (
rFst ** rSnd)
= (
fst / rFst ** snd / rSnd)
133 | Sqrt a => Sqrt b => Sqrt (a, b) where
134 | sqrt (lFst, lSnd) = (sqrt lFst, sqrt lSnd)
137 | Sqrt a => Sqrt b => Sqrt (DPair a (const b)) where
138 | sqrt (
fst ** snd)
= (
sqrt fst ** sqrt snd)