这个主要功能如何实际工作?

时间:2015-12-27 21:36:18

标签: haskell functional-programming

从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次迭代

??? :(

1 个答案:

答案 0 :(得分:4)

第一个是直接形成来自p:xs的模式匹配[2..] - 所以它是p = 2xs一些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