【发布时间】:2013-10-05 11:47:37
【问题描述】:
所以我正在编写一个程序来在 haskell 中生成素数列表。我创建了如下所示的两个函数:
{-
Given a list of prime numbers, this function will
add the next prime number to the list. So, given the
list [2, 3], it will return [2, 3, 5]
-}
nextPrime xs = xs ++ [lastVal + nextCounts]
where
lastVal = (head . reverse) $ xs
isNextPrime y = 0 `elem` ( map ( y `mod`) xs )
nextVals = (map isNextPrime [lastVal, lastVal+1 ..] )
nextCounts = length $ takeWhile (\x -> x) nextVals
allPrimes xs = allPrimes np
where
np = nextPrime xs
现在函数“nextPrime”正在做它应该做的事情。但是,当我调用 allPrimes 时,如下所示:
take 5 $ allPrimes [2,3]
程序进入无限循环。我认为 Haskell 的“懒惰”功能应该处理所有这些问题?我错过了什么??
【问题讨论】:
-
问题:allPrimes 什么时候产生第一个值?答:从来没有。它只是用更大的列表调用它自己,这一步永远不会结束。一个简单的解决方案是在再次递归之前产生一些结果。
-
我建议不要编写一个函数来获取一个列表,然后返回一个带有下一个素数的新列表,为什么不直接创建一个生成无限素数列表的函数呢? Haskell 使用惰性求值,因此您只在请求时计算列表中的一个元素。
标签: haskell infinite-loop lazy-evaluation infinite