让我们从查看divisors函数开始。这是正确的,只有两个问题:
xs争论应该是什么?从定义来看,它看起来应该是下面的所有素数x- 我们称它们为候选素数。所以如果x是10,那么候选素数应该是[2,3,5,7]。但是,这不是函数作为参数得到的。在您的代码中,xs是无限的素数列表。
从技术上讲,divisors不会返回所有除数。divisors 16 [2,3,5,7,11,13]例如,不会返回8。但这是一个小问题。
因此,如果我们可以divisors使用正确的素数列表进行调用,那么我们应该没问题,并且该isPrime函数也可以。
问题是获取候选素数列表。为了清楚起见,我先给出代码,然后解释:
primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p*p <= x) primeLst)]
我做了两个改变:
我通过将其粘贴在前面来确保primeLst包括。2
我通过从无限的素数列表中获取数字来限制候选素数,直到我达到一个高于我正在测试素数的数字的平方根的数字。在这样做时,我稍微改变了候选素数的定义,例如,候选素数26是[2,3,5]而不是[2,3,5,7,11,13,17,19,23]。但它仍然有效。
两个问题让你思考:
为什么它仍然适用于候选素数的新定义?
为什么以下代码行不起作用,即使它似乎应该给出候选素数的原始定义?
:
primeLst = 2 : [ x | x <- [3..], isPrime x (takeWhile (\p -> p < x) primeLst)]
最后一个问题很难,所以如果您有任何问题,请在评论中发表。