【发布时间】:2019-02-25 07:48:03
【问题描述】:
在Haskell Wiki article on prime numbers 中,描述了以下埃拉托色尼筛的实现:
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,这是最终的答案。是否有一个好的经验法则可以知道编译器何时足够聪明以处理无限情况?
【问题讨论】:
-
Haskell 自己不知道。但
minus的实现可能。鉴于在该代码片段中我们有minus、union和unionAll来自Data.List.Ordered,这意味着在某些时候,您使用的无限列表是有序的这一事实用于缩短计算.运行时将保证,一旦它知道列表的第三个元素(即,它知道列表的形式为a : b : c : rest),它将停止计算列表的其余部分。
标签: haskell functional-programming lazy-evaluation ghc sieve-of-eratosthenes