为什么此代码返回空列表或失败?哈斯克尔

时间:2013-05-13 14:27:57

标签: haskell

primes :: [Int]
primes = sieve [2..]

sieve :: [Int] -> [Int]
sieve (p:xs)= p:sieve[x|x<-xs,x `mod` p /= 0]

f :: Int->Int
f n = head [x|x<-[0,(product (filter (<n) primes))..],x/=0,sum (map (x `mod`) [1..n]) == 0]

加载到GHCi 并输入“f 20” 失败......请帮帮我

1 个答案:

答案 0 :(得分:10)

问题在于filter (< n) primes。由于primes无限非常长的 1 列表,因此它需要很长时间才能终止,因为它不知道(< n)最终会返回False表示所有素数超过列表中的某个点,因此必须继续检查整个列表。

> filter (< 20) primes
[2,3,5,7,11,13,17,19^CInterrupted.

改为使用takeWhile (< n) primes

> takeWhile (< 20) primes
[2,3,5,7,11,13,17,19]

1 由于[Int]类型,它是有限的。如果它是[Integer],那将是无限的。