假设我有一个所有素数的列表,定义为
primes :: (Enum α, Integral α) => [α]
primes = sieve [2..]
where sieve :: (Integral α) => [α] -> [α]
sieve [] = undefined
sieve (x:xs) = x : (sieve $ filter ((/= 0) . (flip mod x)) xs)
我想primes
通过多个不同的功能来提供信息,例如:
sumOfPrimesLessThan :: (Integral α) => α -> α
sumOfPrimesLessThan n = sum $ takeWhile (< n) primes
或者
productOfPrimesLessThan :: (Integral α) => α -> α
productOfPrimesLessThan n = foldl (*) 1 $ takeWhile (< n) primes
或某事,好像通过做
main = do print (sumOfPrimesLessThan 1000 :: Integer)
print (productOfPrimesLessThan 1000 :: Integer)
Haskell 会在任何时候重新计算primes
或其中的任何部分吗?什么会缓存?什么不会被缓存?
附录 0:假设我有另一个函数
prime = flip elem primes
如果prime
要使用不同的参数进行评估,每个评估都会重新评估primes
吗?例如:
allPrime = all prime