在Haskell Wiki关于质数的文章中,描述了以下Eratosthenes筛法的实现:
primes = 2 : 3 : minus [5,7..] (unionAll [[p*p, p*p+2*p..] | p <- tail primes])
在做任务时,确保你了解任务的具体要求和期限。在开始之前,先规划好完成任务所需的步骤,并相应地安排时间。将任务分解成小部分,逐一完成,更易于管理。最后,不要忘记检查和审查工作。
primes !! 2
在这种特定情况下,Haskell是如何识别不尝试对primes
(也就是[3..]
)中所有p
进行计算,而仅与3
进行集合相减的?换句话说,Haskell如何知道其他任何p
(或其倍数)都不会匹配最终的答案5
?是否有一个好的经验法则可以知道编译器何时足够聪明,能够处理无限情况?
minus
的实现可能知道。在这段代码片段中,我们使用了来自Data.List.Ordered
的minus
、union
和unionAll
,这意味着在某个时刻会利用所使用的无限列表是有序的这一事实来短路计算。运行时保证的是,只要它知道列表的第三个元素(也就是知道列表的形式为a:b:c:rest
),就会停止对列表剩余部分的计算。 - Mor A.