Haskell素数序列递归

Haskell primes number sequence recursion

我需要创建一个不带任何参数的素数函数,returns 我需要列出所有素数。 这是我想出的代码:

isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n = 
        if (all(\y-> (y < isqrt n) && ((n `mod` y) /= 0)) primes) 
        then
           n:primes' (n+1)
        else
           primes` (n+1)

程序只打印 2:3: 然后就停止了。 这不应该因为惰性评估而起作用吗? (通过将素数作为到目前为止构建的列表,并能够查看我当前的数字是否可以被该列表中的任何数字整除,然后如果是则追加它并继续递归,如果不能继续递归)。

任何人都可以指出我的错误吗?

一些要点:从技术上讲,您的程序不打印任何内容。其次,它甚至无法编译——请注意最后一行的错别字。

关于您的问题:在您的函数中,您在无限列表 primes 上调用 all,而 all 试图遍历所有列表——这就是程序挂起的原因。您只需要从 primes 中获取您需要的元素,然后才应用 all。例如:

isqrt = floor . sqrt . fromIntegral
primes = 2:3:(primes' 4)
primes' n =
        if (all (\y-> (n `mod` y) /= 0) (takeWhile (<= isqrt n) primes))
        then
           n:primes' (n+1)
        else
           primes' (n+1)

main = print (take 5 primes)

编辑: 按照@behzad.nouri 的建议使用 takeWhile