所以我正在制作一个素数列表来帮助我使用简单的试除法学习haskell(在我对语言变得更好之前没有花哨的东西)。我正在尝试使用以下代码:
primes = 2 : [ x | x <- [3..], all (\p -> (mod x p) /= 0) primes]
这是加载没有错误。然而:
>take 2 primes
[2ERROR - C stack overflow
我用嵌套列表推导尝试了同样的事情。它不起作用。我猜我做了太多递归调用,但如果我只计算一个素数,情况就不应该如此。在我看来,懒惰的评估应该可以做到take 2 primes
以下几点:
primes = 2 : [ 3 | all (\p -> (mod 3 p) /= 0) [2] ]
哪个不需要那么多计算 - mod 3 2 == True
,所以all (\p -> (mod 3 p) /= 0) == True
,这意味着take 2 primes == [2, 3]
,对吗?我不明白为什么这不起作用。希望更精通函数式编程黑魔法的人可以帮助我......
这是在拥抱,如果这有什么不同的话。
编辑-我能够想出这个解决方案(不漂亮):
primes = 2 : [ x | x <- [3..], all (\p -> (mod x p) /= 0) (takeWhile (<= (ceiling (sqrt (fromIntegral x)))) primes)]
EDIT2- 当通过 HUGS 或 GHCi 解释时,该程序工作正常,但是当我尝试用 GHC 编译它时,它输出test: <<loop>>
. 有人知道问题是什么吗?