Чтобы помочь мне изучить Haskell, я работаю над проблемами Project Euler. После решения каждой проблемы я проверяю свое решение против вики-страницы Haskell, пытаясь узнать лучшие методы кодирования. Вот решение для проблемы 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)
Мое наивное чтение этого состоит в том, что primes
определяется в терминах primeFactors
, который определяется в терминах primes
. Поэтому оценка primeFactors 9
будет следовать этому процессу:
- Оценить
factor 9 primes
. - Задайте
primes
для своего первого элемента, который равен 2. - Задайте
primes
для следующего элемента. - В рамках этого процесса оцените
primeFactors 3
. - Задайте
primes
для своего первого элемента, который равен 2. - Задайте
primes
для следующего элемента. - В рамках этого процесса оцените
primeFactors 3
. - ...
Другими словами, шаги 2-4 будут повторяться бесконечно. Очевидно, я ошибаюсь, поскольку алгоритм завершается. Какую ошибку я делаю здесь?