Haskell の学習を支援するために、Project Euler の問題に取り組んでいます。各問題を解決した後、Haskell wiki と照らし合わせて解決策を確認し、より良いコーディング プラクティスを学びます。問題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 が無限に繰り返されます。アルゴリズムが終了するので、明らかに私は間違っています。私はここでどんな間違いを犯していますか?