【发布时间】:2015-05-21 16:29:31
【问题描述】:
我正在尝试在无限列表上使用埃拉托色尼筛算法生成素数。我听说 foldr 会懒惰地检查列表,但每次我尝试使用以下算法时都会出现堆栈溢出异常:
getPrimes :: [Int]
getPrimes = foldr getNextPrime [2] [3,5..]
where
getNextPrime n primes
| not $ isAnyDivisibleBy primes n = primes ++ [n]
| otherwise = primes
isAnyDivisibleBy primes n = any (\x -> isDivisibleBy n x) primes
isDivisibleBy x y = x `mod` y == 0
示例:
takeWhile (\x -> x < 10) getPrimes
*** Exception: stack overflow
列表正在某个地方被评估,但我不知道在哪里。
【问题讨论】:
-
这个标题有两种读法;)
标签: haskell functional-programming