从Haskell的主页https://www.haskell.org/
获取primes = filterPrime [2..]
where filterPrime (p:xs) =
p : filterPrime [x | x <- xs, x `mod` p /= 0]
看了这个函数几分钟后,我意识到我真的不明白这个函数到底在做什么,我想知道发生了什么。
但首先,我认为这是正在发生的事情:
由于懒惰的评估,每次迭代中只有一个来自列表推导的成员......就像这样:
第一次迭代
2 : filterPrime [x | x <- [3..], x `mod` p /= 0]
第二次迭代
2 : 3 : filterPrime [x | x <- [4..], x `mod` p /= 0]
第3次迭代
??? :(
答案 0 :(得分:4)
第一个是直接形成来自p:xs
的模式匹配[2..]
- 所以它是p = 2
和xs
一些thunk
下一个需要评估xs
,因此需要评估
[ x | x <- [3..], x `mod` 2 /= 0 ]
以x = 3
开头(过滤器也没问题) - 所以你现在有了p:xs
(请记住带有filterPrime
的递归定义)和p=3
但是这次xs
已经针对`mod` 2 /= 0
进行了过滤,现在也会针对3
进行过滤 - 这将针对每个找到的素数继续进行 - 每次只查看剩余的数字到目前为止,这不是所有找到的素数的倍数。
你觉得它有点像sieve of eratosthenes,我猜它也被称为(但它有some objections)