Functions ---------------------------------------------------------------------- > module Function ( Ident, Function (..), Prim (..), > constant, > csplit, summands, factors, esplit, > (+++), (***), summ, prod, minus, > nat, zero, half, mhalf, one, mone, two, mtwo, ten > ) > where ---------------------------------------------------------------------- ---------------------------------------------------------------------- > import Ratio > import Prim ( Ident, Prim(..) ) ---------------------------------------------------------------------- ---------------------------------------------------------------------- > infixr 1 :.: > infixr 2 +++ > infixr 3 *** > infixr 5 :^: ---------------------------------------------------------------------- Definition for Functions ---------------------------------------------------------------------- > data Function = Ratio Rational > | Const Ident > | Prim Prim > | Fun Ident > | Derive Int Function > | Id > | Function :.: Function > | Summ [Function] > | Prod [Function] > | Function :^: Function > deriving (Eq, Ord, Show) ---------------------------------------------------------------------- Testing functions ---------------------------------------------------------------------- > constant (Ratio n) = True > constant (Const c) = True > constant (f :.: g) = constant f || constant g > constant (Summ fs) = all constant fs > constant (Prod fs) = all constant fs > constant (f :^: g) = constant f && constant g > constant _ = False ---------------------------------------------------------------------- Constructors ---------------------------------------------------------------------- > summ [] = zero > summ [f] = f > summ fs = Summ fs ---------------------------------------------------------------------- ---------------------------------------------------------------------- > prod [] = one > prod [f] = f > prod fs = Prod fs ---------------------------------------------------------------------- ---------------------------------------------------------------------- > f +++ g = Summ [f, g] > f *** g = Prod [f, g] ---------------------------------------------------------------------- ---------------------------------------------------------------------- > minus f = Prod [mone, f] ---------------------------------------------------------------------- ---------------------------------------------------------------------- > nat n = Ratio (n % 1) ---------------------------------------------------------------------- ---------------------------------------------------------------------- > zero = nat 0 > half = Ratio ( 1 % 2) > mhalf = Ratio (-1 % 2) > one = nat 1 > mone = nat (-1) > two = nat 2 > mtwo = nat (-2) > ten = nat 10 ---------------------------------------------------------------------- Destructors ---------------------------------------------------------------------- > csplit (f :.: g) = (f, g) > csplit f = (f, Id) ---------------------------------------------------------------------- ---------------------------------------------------------------------- > summands (Ratio m) | m == 0 = [] > summands (Summ fs) = fs > summands f = [f] ---------------------------------------------------------------------- ---------------------------------------------------------------------- > factors (Ratio m) | m == 1 = [] > factors (Prod fs) = fs > factors f = [f] ---------------------------------------------------------------------- ---------------------------------------------------------------------- > esplit (f :^: g) = (f, g) > esplit f = (f, one) ----------------------------------------------------------------------