List 如何在其条件下使用不完整列表

List 如何在其条件下使用不完整列表,list,haskell,list-comprehension,List,Haskell,List Comprehension,我知道。。标题解释得不好。如果您有更好的标题,请在评论中告诉我。我正在制作一个质数生成器,用于娱乐和学习。以下是我的代码: divisors x xs = [ y | y <- [1]++xs++[x], x `mod` y == 0] isPrime x xs = divisors x xs == [1,x] primeLst = [ x | x <- [2..], isPrime x primeLst] 除数x xs=[y | y计算primeLst的至少一个元素需要计算isP


我知道。。标题解释得不好。
如果您有更好的标题,请在评论中告诉我。
我正在制作一个质数生成器,用于娱乐和学习。
以下是我的代码:

divisors x xs = [ y | y <- [1]++xs++[x], x `mod` y == 0]
isPrime x xs = divisors x xs == [1,x]
primeLst = [ x | x <- [2..], isPrime x primeLst]

除数x xs=[y | y计算
primeLst
的至少一个元素需要计算
isPrime 2 primeLst
的至少两个元素需要计算
除数2 primeLst
的至少两个元素需要计算
[1]++primeLst++[2]
,这至少需要计算
primeLst
中的一个元素。不会发生


您可能能够使用
[1]++(primesLessThan x)+[x]
使某些东西工作,但我看不到一种定义
(primesLessThan x)的简单方法
就避免计算循环的
primeLst
而言。

计算
primeLst
的至少一个元素需要计算
isPrime 2 primeLst
这需要计算至少两个
元素的除数2 primeLst
,这需要计算
[1]的至少两个元素++primeLst++[2]
,这要求至少计算
primeLst
的一个元素。这不会发生


您可能能够使用
[1]++(primesLessThan x)+[x]
使某些东西工作,但我看不到一种定义
(primesLessThan x)的简单方法
关于避免计算循环的
primeLst

让我们先看看
除数函数。它有点正确,只有两个问题:

  • xs
    参数应该是什么?从定义来看,它应该是
    x
    下面的所有素数-让我们称这些为候选素数。因此,如果
    x
    10
    ,那么候选素数应该是
    [2,3,5,7]
    。但是,这不是函数作为参数得到的结果。在代码中,
    xs
    是素数的无限列表

  • 从技术上讲,
    除数
    不会返回所有除数。
    除数16[2,3,5,7,11,13]
    不会返回
    8
    。但这是一个小细节

  • 因此,如果我们可以使用正确的素数列表调用除数,那么我们应该可以,并且
    isPrime
    函数也可以

    问题在于获取候选素数的列表。为了清楚起见,我将首先给出代码,然后解释:

    primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p*p <= x) primeLst)]
    

    最后一个问题很难回答,因此如果您有问题,请将其发布在评论中。

    让我们先看看除数函数。它有点正确,只有两个问题:

    dividedBy a b = a `mod` b == 0
    isPrime x = null $ filter (x `dividedBy`) $ takeWhile (\y -> y * y <= x) primeLst
    primeLst = 2:(filter isPrime [3..])
    
  • xs
    参数应该是什么?从定义来看,它应该是
    x
    下面的所有素数-让我们称这些为候选素数。因此,如果
    x
    10
    ,那么候选素数应该是
    [2,3,5,7]
    。但是,这不是函数作为参数得到的结果。在代码中,
    xs
    是素数的无限列表

  • 从技术上讲,
    除数
    不会返回所有除数。
    除数16[2,3,5,7,11,13]
    不会返回
    8
    。但这是一个小细节

  • 因此,如果我们可以使用正确的素数列表调用除数,那么我们应该可以,并且
    isPrime
    函数也可以

    问题在于获取候选素数的列表。为了清楚起见,我将首先给出代码,然后解释:

    primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p*p <= x) primeLst)]
    
    最后一个问题很难回答,因此如果您有问题,请在评论中发表。

    被a b=a`mod`b==0分割
    
    dividedBy a b = a `mod` b == 0
    isPrime x = null $ filter (x `dividedBy`) $ takeWhile (\y -> y * y <= x) primeLst
    primeLst = 2:(filter isPrime [3..])
    
    iPrime x=null$filter(x`dividedBy`)$takeWhile(\y->y*y*y
    dividedBy a b=a`mod`b==0
    
    isPrime x=null$filter(x`dividedBy`)$takeWhile(\y->y*y*y提示:您只需要测试素数到数字平方根的可除性,因为任何大于平方根的除数都伴随着一个小于平方根的除数。谢谢@hammar..我计划在解决这个问题后这样做:)提示:您只需要测试素数在数字平方根以下的可除性,因为任何大于平方根的除数都伴随着一个小于平方根的除数。谢谢@hammar..我计划在解决此问题后执行此操作:)然后我将以以下方式修改我的代码:
    primeLst=[2]++[x | x然后我将以这种方式修改我的代码:
    primeLst=[2]++[x | x感谢您的澄清和时间:D Haskell是一种有趣的编程语言。下面是我的答案:1.因为Haskell很懒惰,所以只需要primeLst中的数字,它们的平方根就小于x,而不需要计算其他列表元素。2.因为iPrime会检查除数是否为1和x,以及在这个代码中,x不存在,我认为用
    p
    p替换
    p
    第一个问题的答案是由哈马尔在他对你的问题的评论中给出的。14的平方根在3到4之间,所以候选素数是
    [2,3]
    还是
    [2,3,5,7,11,13]都没有关系
    ,因为即使7除以14,7也有一对(即2)下面的平方根也除以14。因此,您不需要在候选素数中包含高于平方根的数字,因为它们将与平方根以下的数字配对,平方根以下的数字将包含在缩减的候选素数中。@IderAghbal:Use
    hPutStrLn
    而不是
    hPrint
    。后者调用de>show
    将结果格式化为Haskell值,这样字符串就可以得到引号等。
    hPutStrLn
    直接写入字符串。@IderAghbal:This code(使用
    takeWhile(\p->p*p@IderAghbal:cont:return
    False),只要它意识到
    素数x
    cont