When pattern matching on lists, parenthesis must surround the pattern. For example,
length [] = 0 length (x:xs) = 1 + length xs map f [] = [] map f (x:xs) = f x : map f xs fac 0 = 1 fac n = n * fac (n - 1)
Infinite lists can be used to produce values, one of which may then be selected. To select elements, we use take, defined as
take 0 l = [] take n [] = [] take n (x:xs) = x : take (n - 1) xs
The infinite list of primes, using the Sieve of Eratosthenes, is
primes = sieve [2 ..] sieve (x:xs) = x : sieve [y | y <- xs, y `mod` x > 0]
Where y `mod` x produces the remainder of dividing y by x.
Selecting the first five prime numbers is, thus,
take 5 primes
There exists a function, zipWith, that takes a function of two arguments, and two lists of arguments, and applies the function to the elements of the list in turn, producing a list. This is defined as
zipWith f [] [] = [] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
For example,
listSums l = out
where
out = 0 : zipWith (+) l out
Here, listSums can be used to produce the running sum of a list of numbers of any length, including infinite length lists (if you have the time).
Using zipWith, we can define the infinite list of factorials thus:
facs = 1 : zipWith (*) [1..] facs
And, using the infinite list, define the factorial function, fac, as
fac n = last (take 5 facs)
Where last returns the last element of a list.
There exists an infix operator, ., pronounced "compose", defined such that
f . g x = f (g x)
For example,
twice f = f . f add1 = (1 +)
Such that evaluating
(twice add1) 12
Produces
(twice add1) 12 (add1 . add1) 12 add1 (add1 12) add1 13 14
iter, which takes an integer, n, a function of one argument, f, and a base value, x. iter applies the f to itself n-1 times, then applies f to x. For example, iter 3 f x produces f (f (f x)), and iter 0 f x produces x.minValue, which takes a function, f, that takes an integer and returns an integer, and an integer, n. minValue determines the minimum value of f when applied to all the integers from 0 to n. For example, minValue add1 5 produces 1, which is the smallest value add1 produces when applied to each number in [0,1,2,3,4,5].
map add1 (map add1 ls), map fac (map add1 ls), and other maps over maps. Can you conclude a general property about map f (map g ls) that can be written using only one map?sieve function is one where the list is not empty. Why?