您好,我必须实现筛检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