Haskell Eratosthenes无限列表的筛选
您好,我必须实现一个用于筛选埃拉托斯坦的功能 我已经有一个函数了Haskell Eratosthenes无限列表的筛选,haskell,recursion,sieve-of-eratosthenes,Haskell,Recursion,Sieve Of Eratosthenes,您好,我必须实现一个用于筛选埃拉托斯坦的功能 我已经有一个函数了 removep p l nats 它删除与谓词p和函数匹配的l元素 removep p l nats 这将返回一个无限的自然数列表,我应该在我的解决方案中使用这两个 现在,我确实了解筛子本身是如何工作的,但似乎我在实现这一点上遇到了问题 我正在做这样的事情: sieve = (drop 1 nats) where sieve (h:t) = h : (removep (\x -> (mod x p) == 0
removep p l
nats
它删除与谓词p
和函数匹配的l
元素
removep p l
nats
这将返回一个无限的自然数列表,我应该在我的解决方案中使用这两个
现在,我确实了解筛子本身是如何工作的,但似乎我在实现这一点上遇到了问题
我正在做这样的事情:
sieve = (drop 1 nats)
where
sieve (h:t) = h : (removep (\x -> (mod x p) == 0) t) : sieve
但这似乎不起作用。有什么帮助吗?
还要注意,这是一个赋值,因此如果可能,不要给出精确解。我宁愿知道我做错了什么,以及我需要如何改变它。提前感谢。您的代码中有一些错误:
sieve
列表,该列表应该是素数列表,但在中,您可以使用一个函数将名称sieve
隐藏起来。在这个定义中,您使用sieve
作为列表,但在这里它实际上引用了函数,因此您得到了一个typeerror
您希望将函数应用于drop 1 nats
,以获取素数列表
mod x p
中,它应该是mod x h
,因为h
是您在那里考虑的主要参数sieve(h:t)=h:removep…:_代码>但这里您创建了一个列表,其中第一个元素是h
,一个数字,第二个元素是removep…
,这是一个列表,然后剩余的元素被筛取(正如前面所说的,这是不正确的)
mod
来检查整除性基本思想是获得
nats
列表作为筛选的起点。然后递归地将removep
函数和谓词应用于除第一个元素以外的所有元素
你很接近,但我认为你的问题在于符号(见巴库留的答案)
我不会给你答案,但我会给你一个提示:
sieve = s (drop 1 nats)
where
-- Recursive definition of s here
-- s (h:t) = ???
我希望我没有放弃太多而使它变得微不足道。祝你好运
PS:正如巴库留所提到的,这并不是一个真正的筛子。有关这件事的更多信息,请看一看令人耳目一新的是,有人只是在正确的方向上要求一点,而不是让其他人来做所有的工作。谢谢你的观点。关于(2),这是一个打字错误。其想法是使用参数
(\x->(mod x h)==0)
和t
应用removep
,以便删除列表头可除的内容。