haskell列表理解优化

时间:2015-07-07 17:21:18

标签: haskell

我为项目euler编写了一段代码:

primes :: [Integer]
primes = filter isPrime [2..]
    where isPrime n = not $ any (\x -> n `mod` x == 0) [2..n-1]

ans = max [x | x <- primes, 600851475143 `mod` x == 0]

当然我并没有等到它终止。但是我想知道它会回来吗?我想这取决于haskell是否知道停在600851475143?

1 个答案:

答案 0 :(得分:3)

不,这永远不会回来。 Haskell具有非严格的语义,因此兼容的实现不需要评估未使用的表达式的部分;然而,它不是一个定理证明者。运行时系统不会尝试证明列表中不能包含任何更大的数字。相反,当您的表达式被评估时,max 必须查看列表中的每个项目以确定其最大值。这将是一个问题,因为根据我上面所说的,你的列表永远不会被确定为完成(因为源列表是无限的,总是有更多元素可能包含在列表表达式中)。

此处您需要的是takeWhile,然后是filter,最长时间<。

另外,我可能不需要指出这一点,但是你的素数方法非常低效,并且真的很长时间来生成你认为需要的数字。问题