这个质数函数实际上是如何工作的?

yey*_*eyo 5 haskell functional-programming

摘自 Haskell 主页https://www.haskell.org/

primes = filterPrime [2..] 
  where filterPrime (p:xs) = 
          p : filterPrime [x | x <- xs, x `mod` p /= 0]
Run Code Online (Sandbox Code Playgroud)

看了这个函数几分钟后,我意识到我不太明白这个函数实际上在做什么,我想知道发生了什么。

但首先,我相信这是正在发生的事情:

由于惰性评估,每次迭代中仅采用列表理解中的一个成员......如下所示:

第一次迭代

2 : filterPrime [x | x <- [3..], x `mod` p /= 0]
Run Code Online (Sandbox Code Playgroud)

第二次迭代

2 : 3 : filterPrime [x | x <- [4..], x `mod` p /= 0]
Run Code Online (Sandbox Code Playgroud)

第三次迭代

??? :(
Run Code Online (Sandbox Code Playgroud)

Car*_*ten 5

好吧,第一个是直接形成模式匹配p:xs-[2..]所以它p = 2xs一些重击

接下来需要评估xs因此它需要评估

[ x | x <- [3..], x `mod` 2 /= 0 ]
Run Code Online (Sandbox Code Playgroud)

将以x = 3(这对于过滤器来说是可以的)开始 - 所以你现在也有p:xs(记住递归定义filterPrime),p=3但这次xs已经被过滤`mod` 2 /= 0并且现在也将被过滤3- 这将对每个找到的素数进行- 每次您只会查看剩余的数字,这些数字不是迄今为止找到的所有素数的倍数。

你看它有点像埃拉托色尼筛,我猜它也这么叫(但也有人反对