让我们进行一些等式推理。
primes = sieve [2..]
sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0]
[2..]
是 [2, 3, 4, 5, ...]
的语法糖,因此
primes = sieve [2, 3, 4, 5, 6, ...]
一次内联 sieve
:
primes = 2 : sieve [x | x <- [3, 4, 5, 6, 7, ...], x `mod` 2 /= 0]
首先,
x
获得了值
3
,通过了
mod 2
过滤器。
primes = 2 : sieve (3 : [x | x <- [4, 5, 6, 7, ...], x `mod` 2 /= 0])
再次内联 sieve
(我将x
重命名为y
以避免混淆)
primes = 2 : 3 : sieve [y | y <- [x | x <- [4, 5, 6, 7, ...], x `mod` 2 /= 0],
y `mod` 3 /= 0]
现在
x = 4
未通过
mod 2
过滤器,但
x = 5
通过了。因此,
primes = 2 : 3 : sieve [y | y <- 5 : [x | x <- [6, 7, 8, ...], x `mod` 2 /= 0],
y `mod` 3 /= 0]
这个 y = 5
也通过了 mod 3
的筛选,所以现在我们有了
primes = 2 : 3 : sieve (5 : [y | y <- [x | x <- [6, 7, 8, ...], x `mod` 2 /= 0],
y `mod` 3 /= 0])
将 sieve
进行一次扩展(使用 z
替换 y
),得到:
primes = 2 : 3 : 5 : sieve [z | z <- [y | y <- [x | x <- [6, 7, 8, ...],
x `mod` 2 /= 0],
y `mod` 3 /= 0],
z `mod` 5 /= 0]
扩展将继续以相同的方式进行。