Haskell: The Craft of Functional Programming
Simon Thompson
(c) Addison-Wesley, 1999.
Chapter 4
> module Chapter4 where
Designing a program in Haskell
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> maxThree :: Int -> Int -> Int -> Int
> maxThree x y z = (x `max` y) `max` z
> middleNumber :: Int -> Int -> Int -> Int
> middleNumber x y z
> | between y x z = x
> | between x y z = y
> | otherwise = z
What follows here is a dummy definition of between; you need to replace this
with a proper definition for the function middleNumber to work.
> between :: Int -> Int -> Int -> Bool
> between = between
Primitive recursion over Int
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The factorial of n is 1*2*...*(n-1)*n, so that factorial of four is 24.
It is often written n!
> fac :: Int -> Int
> fac n
> | n==0 = 1
> | n>0 = fac (n-1) * n
> | otherwise = error "fac only defined on natural numbers"
n
Raising two to a power: power2 n is 2 in mathematical notation.
> power2 :: Int -> Int
> power2 n
> | n==0 = 1
> | n>0 = 2 * power2 (n-1)
The sum of the factorials up to a particular value, 0! + 1! + ... n!.
> sumFacs :: Int -> Int
> sumFacs n
> | n==0 = 1
> | n>0 = sumFacs (n-1) + fac n
The sum of the values of a function up to a particular value:
f 0 + f 1 + ... f n
from which you can reconstruct sumFacs: sumFacs n = sumFun fac n
> sumFun :: (Int -> Int) -> Int -> Int
> sumFun f n
> | n==0 = f 0
> | n>0 = sumFun f (n-1) + f n
The maximum number of regions into which n lines can cut a plane.
> regions :: Int -> Int
> regions n
> | n==0 = 1
> | n>0 = regions (n-1) + n
The Fibonacci numbers 0, 1, 1, 2, 3, 5, ..., u, v, u+v, ...
> fib :: Int -> Int
> fib n
> | n==0 = 0
> | n==1 = 1
> | n>1 = fib (n-2) + fib (n-1)
Division of integers
> remainder :: Int -> Int -> Int
> remainder m n
> | m | otherwise = remainder (m-n) n
> divide :: Int -> Int -> Int
> divide m n
> | m | otherwise = 1 + divide (m-n) n
Testing
^^^^^^^
Does this function calculate the maximum of three numbers?
> mysteryMax :: Int -> Int -> Int -> Int
> mysteryMax x y z
> | x > y && x > z = x
> | y > x && y > z = y
> | otherwise = z