To help me learn Haskell, I am working through the problems on Project Euler. After solving each problem, I check my solution against the Haskell wiki in an attempt to learn better coding practices. Here is the solution to problem 3:
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
primeFactors n = factor n primes
where
factor n (p:ps)
| p*p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p:ps)
| otherwise = factor n ps
problem_3 = last (primeFactors 317584931803)
My naive reading of this is that primes
is defined in terms of primeFactors
, which is defined in terms of primes
. So evaluating primeFactors 9
would follow this process:
- Evaluate
factor 9 primes
. - Ask
primes
for its first element, which is 2. - Ask
primes
for its next element. - As part of this process, evaluate
primeFactors 3
. - Ask
primes
for its first element, which is 2. - Ask
primes
for its next element. - As part of this process, evaluate
primeFactors 3
. - ...
In other words, steps 2-4 would repeat infinitely. Clearly I am mistaken, as the algorithm terminates. What mistake am I making here?