在Haskell中列出理解

时间:2017-11-17 10:48:47

标签: haskell list-comprehension

我想在Haskell中编写一个简单的列表理解,它包含一系列无限素数。

我的尝试:

isPrime 1 = False
isPrime x = and [x `mod` z /= 0 | z <- [1..x-1]]

primes = [x | x <-[1..], isPrime x ]

但是当我尝试在控制台上以take 10 primes运行它时,它会卡住!有什么问题?

1 个答案:

答案 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暗示了问题所在。