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” 失败......请帮帮我
答案 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]
,那将是无限的。