A truly remarkable thing about Haskell--and about lazy evaluation--is that it is possible
to work with infinite lists. Not just large ones, but actual infinities! The trick, of course,
is that those parts of the list which are unnecessary for a particular calculation are not
calculated explicitly (just the rule for their expansion is kept by the runtime
calculated explicitly (just the rule for their expansion is kept by the runtime
environment).
A famous and ancient algorithm for finding prime numbers is the Sieve of Eratosthenes.
The idea here is to keep an initial element of the list of integers, but strike off all of its
multiples as possible primes. The example does this, but is performed only as far as
needed for a specific calculation. The list primes, however, really is exactly the list of
all the prime numbers!