Почему этот фрагмент кода Haskell не является бесконечно рекурсивным?

Чтобы помочь мне изучить 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)

Мое наивное толкование состоит в том, что простые числа определены в терминах primeFactors , который определяется в терминах простых чисел . Таким образом, оценка primeFactors 9 будет следовать такому процессу:

  1. Вычислить фактор 9 простых чисел .
  2. Задайте простых чисел для его первого элемента, который равен 2.
  3. Задайте простых чисел для его следующего элемента.
  4. В рамках этого процесса оцените primeFactors 3 .
  5. Задайте простых чисел для его первого элемента, который равен 2.
  6. Задайте простых чисел для его следующего элемента.
  7. В рамках этого процесса оцените primeFactors 3 .
  8. ...

Другими словами, шаги 2–4 будут повторяться бесконечно. Явно ошибаюсь, так как алгоритм завершается.Какую ошибку я здесь делаю?

17
задан Zero Piraeus 22 January 2015 в 17:25
поделиться