让我们做一些等式推理。
primes = sieve [2..]
sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0]
The [2..]
是语法糖[2, 3, 4, 5, ...]
so
primes = sieve [2, 3, 4, 5, 6, ...]
Inline sieve
once:
primes = 2 : sieve [x | x <- [3, 4, 5, 6, 7, ...], x `mod` 2 /= 0]
First, x
获得价值3
它通过了mod 2
filter
primes = 2 : sieve (3 : [x | x <- [4, 5, 6, 7, ...], x `mod` 2 /= 0])
Inline sieve
再次(我重命名为x
to y
以防止混淆)
primes = 2 : 3 : sieve [y | y <- [x | x <- [4, 5, 6, 7, ...], x `mod` 2 /= 0],
y `mod` 3 /= 0]
Now 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]
This 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]
并且扩张以同样的方式继续进行。