-- Simple functions square :: Integer -> Integer square x = x * x add :: Integer -> Integer -> Integer add x y = x + y (????!) :: Integer -> Integer -> Integer (????!) x y = x * y - x - y -- Calculations fact :: Integer -> Integer fact 0 = 1 fact n = n * fact (n - 1) fib :: Integer -> Integer fib 1 = 1 fib 2 = 1 fib n = fib(n-1) + fib(n-2) -- Factorial with optimization fact1 :: Integer -> Integer fact1 n = fact1a n 1 fact1a :: Integer -> Integer -> Integer fact1a 0 f = f fact1a n f = fact1a (n-1) $! (n*f) -- Finnonachi with optimization fib1 :: Integer -> Integer fib1 n = fib1a 1 1 n fib1a :: Integer -> Integer -> Integer -> Integer fib1a a b 1 = a fib1a a b 2 = b fib1a a b n = fib1a b (a+b) (n-1) -- Simple pattern matching anda :: Bool -> Bool -> Bool anda False False = False anda _ _ = True -- Constant eps ::Float eps = 0.000001 -- High-order functions twice :: (Integer -> Integer) -> Integer -> Integer twice f x = f (f x) applyn :: Int -> (Integer -> Integer) -> Integer -> Integer applyn 0 _ x = x applyn n f x = f (applyn (n-1) f x) diff :: (Float -> Float) -> Float -> Float diff f x = (f (x+eps) - f (x-eps)) / (2*eps) -- Branching mina :: Float -> Float -> Float mina a b = if a < b then a else b minb :: Float -> Float -> Float minb a b = case a < b of True -> a False -> b minc :: Float -> Float -> Float minc a b | a <= b = a | a > b = b -- Where and let minRoot :: Float -> Float -> Float -> Float minRoot a b c = min ((-b-sd)/n) ((-b+sd)/n) where sd = sqrt(b*b - 4*a*c) n = 2*a minRootL a b c = let sd = sqrt(b*b - 4*a*c) n = 2*a in min ((-b-sd)/n) ((-b+sd)/n)