import SimplePrelude hiding (flip) square :: Float -> Float square x = x *. x -- Derivation of a function on an argument: derive :: (Float -> Float) -> (Float -> Float) derive f = f' where f' :: Float -> Float f' x = (f (x +. dx) -. f x) /. dx dx :: Float dx = 0.0001 double :: Float -> Float double = derive square cubic :: Float -> Float cubic x = x *. x *. x -- with lambda abstraction: lderive :: (Float -> Float) -> (Float -> Float) lderive f = \x -> (f (x +. dx) -. f x) /. dx where dx = 0.0001 -- Addition on floats: add :: Float -> Float -> Float add x y = x +. y add1 :: Float -> (Float -> Float) add1 x = \y -> x +. y add2 :: (Float -> Float -> Float) add2 = \x y -> x +. y addp :: (Float,Float) -> Float addp (x,y) = x +. y sub :: Float -> Float -> Float sub x y = x -. y -- Change order of two arguments: flip :: (a -> b -> c) -> (b -> a -> c) flip f = \x y -> f y x