Haskell 筛子一开始就卡住了

Haskell 筛子一开始就卡住了,haskell,infinite,sieve,Haskell,Infinite,Sieve,我写了以下内容: iPrime::Integer->[Integer]->Bool iPrime n=all\i->n`mod`i/=0 筛::[整数] 筛=2:[i | i[整数]->Bool isPrime n=all\i->n`mod`i/=0。takeWhile通过将all应用于整个筛选,而不仅仅是迄今为止筛选的值,从而导致无限递归。例如,对于第二个元素,isPrime测试筛选中的所有值,而不是仅测试2 在Python版本中,您编写了 is_prime(n, ps) 它只对目前筛选出的

我写了以下内容:

iPrime::Integer->[Integer]->Bool iPrime n=all\i->n`mod`i/=0 筛::[整数] 筛=2:[i | i[整数]->Bool
isPrime n=all\i->n`mod`i/=0。takeWhile通过将all应用于整个筛选,而不仅仅是迄今为止筛选的值,从而导致无限递归。例如,对于第二个元素,isPrime测试筛选中的所有值,而不是仅测试2

在Python版本中,您编写了

is_prime(n, ps)
它只对目前筛选出的所有数字测试n

is_prime(n, sieve())

现在,使用takeWhile我想说sieve中的理解列表在完成之前不会结束,永远不会。要使用这样的take,sieve必须逐个返回元素。例如,[1..显示1,2,3,4…到无穷大,但您的sieve只显示[2]


或者显然不是我所说的

我还没有弄清楚细节,但你很可能陷入了一个非终止计算,因为你通过了sieve而不是sieve的一个适当前缀,即takeWhile\p->p^2@Jubobs,我试着添加了你建议的修改,它工作了!现在我真的很困惑。为什么它要与takeWhile一起工作\p->p^2但为什么我添加takeWhile时它不起作用?在有限个值之后它应该会停止。我感到困惑。我尝试了@Jubobs建议的修改,但它起了作用。我无法理解为什么他的takeWhile有效,而我的takeWhile无效。哦,现在很清楚,谢谢!使用其他takeWhile有效,因为它只使用已经计算过的pr艾姆斯。