我想在Haskell中编写一个简单的列表理解,它包含一系列无限素数。
我的尝试:
isPrime 1 = False
isPrime x = and [x `mod` z /= 0 | z <- [1..x-1]]
primes = [x | x <-[1..], isPrime x ]
但是当我尝试在控制台上以take 10 primes
运行它时,它会卡住!有什么问题?
答案 0 :(得分:4)
问题出在你的isPrime函数中:
isPrime x = and [x `mod` z /= 0 | z <- [1..x-1]]
将每个元素从1到x-1,并检查余数是否不等于零。如果任何值等于零,则isPrime将返回false。
但是,你将列表理解开始于一个,每个数字都可被整除。
所以,我们只需要从两个开始。
isPrime x = and [x `mod` z /= 0 | z <- [2..x-1]]
现在它按预期工作。
λ> take 10 primes
[2,3,5,7,11,13,17,19,23,29]
如果您在较大的功能中遇到问题,请尝试将其分解并运行每个单独的部件以确保结果符合您的预期。在这种情况下,isPrime 2 == False
暗示了问题所在。