您好,我必须实现筛检Eratosthenes的功能。

我已经有一个功能

removep p l


删除与谓词l匹配的p元素和一个函数

nats


返回无限数量的自然数,我应该在我的解决方案中使用两者。

现在,我确实知道筛子本身是如何工作的,但是似乎我在执行此操作时遇到了问题。

我正在做这样的事情:

sieve = (drop 1 nats)
 where
   sieve (h:t) = h : (removep (\x -> (mod x p) == 0) t) : sieve


但这似乎不起作用。有什么帮助吗?
另请注意,这是一项任务,因此,如果可能,不要放弃确切的解决方案。我宁愿了解一下我在做什么错以及如何更改它。提前致谢。

最佳答案

基本思想是将nats列表作为筛分的起点。然后,将您的removep函数和谓词递归地应用于除第一个元素以外的所有元素。

您接近,但我认为您的问题出在符号上(请参阅Bakuriu的答案)
我不会给你答案,但是我会给你一个提示:

sieve = s (drop 1 nats)
  where
    -- Recursive definition of s here
    -- s (h:t) = ???


我希望我不会付出太多以使其变得微不足道。祝好运。

PS:正如Bakuriu所说,这确实不是一个真正的筛子。有关此问题的更多信息,请查看here

10-07 17:09