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)
好吧,第一个是直接形成模式匹配p:xs-[2..]所以它p = 2和xs一些重击
接下来需要评估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- 这将对每个找到的素数进行- 每次您只会查看剩余的数字,这些数字不是迄今为止找到的所有素数的倍数。