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]
Run Code Online (Sandbox Code Playgroud)
加载到GHCi并输入"f 20"失败......请帮助我
我在读LYAH时遇到了一个问题.
这是我对无限列表中的foldr的想法:
foldr (:) [] [1..] = 1:2:...:**?:[]**
Run Code Online (Sandbox Code Playgroud)
我认为GHCi在评估∞之前不知道它是列表:[].
但GHCi确实知道.
所以我认为它可以识别foldr(:) [] [无限列表] = [无限列表本身].
Prelude> [1..10] == (take 10 $ foldr (:) [] [1..])
True
Prelude> [1..] == (foldr (:) [] [1..])
Interrupted.
Run Code Online (Sandbox Code Playgroud)
然而事实并非如此.
我想知道在评估∞:[]之前GHCi识别它是[1 ..]时实际发生了什么.
只需在评估之前输入推理?