iterate f x returns an infinite list of repeated
applications of
f to
x:
iterate f x == [x, f x, f (f x), ...]
Note that
iterate is lazy, potentially leading to thunk
build-up if the consumer doesn't force each iterate. See
iterate' for a strict variant of this function.