-- Factorial functions implemented in Haskell -- recursive version defined by cases like in mathematics fact1 :: Integer->Integer fact1 0 = 1 fact1 1 = 1 fact1 n = n * fact1(n-1) -- tail recursive version using where clause fact2 :: Integer->Integer fact2 0 = 1 fact2 n = tfact n 1 where tfact 1 m = m tfact n m = tfact (n-1) (m*n) -- tail recursive version using a let clause fact3 :: Integer->Integer fact3 0 = 1 fact3 n = let tfact 1 m = m tfact n m = tfact (n-1) (m*n) in tfact n 1 -- using foldl over a list from 1..n -- equivalent to a for loop in C fact4 :: Integer->Integer fact4 n = foldl (*) 1 [1..n]