IT干货网

list之在 Haskell 中过滤无限列表

shihaiming 2025年12月25日 编程设计 218 0

我有以下实现埃拉托色尼筛法的代码:

primes :: [Int] 
primes = primes' [2..] 
 
primes' :: [Int] -> [Int] 
primes' [] = [] 
primes' (p:ps) = p:(primes' [p' | p' <- ps, not (p' `isMultiple` p)]) 
 
a `isMultiple` b = (a `mod` b) == 0 
 
main = print (sum (primes' [2..100000])) 

我想把 main 改成类似的东西
main = print (sum [p | p <- primes, p < 100000])) 

毫不奇怪,这会挂起,因为它必须将 p 与无限素数列表中的每个元素进行比较。既然我知道素数是按递增顺序排列的,那么一旦找到超出上限的元素,我该如何截断无限列表?

附言理论上,primes' 过滤输入列表以返回素数列表。我知道如果我从 2 以外的地方开始列表会出现一些问题。我仍在研究如何自己解决这个问题,所以请不要剧透。谢谢 ;-)

请您参考如下方法:

在这种情况下,您知道一旦谓词为一个元素返回 false,它将永远不会为后面的元素返回 true,您可以替换 filtertakeWhile , 一旦谓词第一次返回 false ,它就会停止获取元素。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!