让我们从查看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)]
最后一个问题很难,所以如果您有任何问题,请在评论中发表。