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”失败......请帮助我
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”失败......请帮助我
问题出在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]
,那将是无限的。