1
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”失败......请帮助我

4

1 回答 1

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],那将是无限的。

于 2013-05-13T14:40:53.163 回答