Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Eratosthenes无限列表的筛选_Haskell_Recursion_Sieve Of Eratosthenes - Fatal编程技术网

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
    ,以便删除列表头可除的内容。