我为项目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?
答案 0 :(得分:3)
不,这永远不会回来。 Haskell具有非严格的语义,因此兼容的实现不需要评估未使用的表达式的部分;然而,它不是一个定理证明者。运行时系统不会尝试证明列表中不能包含任何更大的数字。相反,当您的表达式被评估时,max
将必须查看列表中的每个项目以确定其最大值。这将是一个问题,因为根据我上面所说的,你的列表永远不会被确定为完成(因为源列表是无限的,总是有更多元素可能包含在列表表达式中)。
此处您需要的是takeWhile
,然后是filter
,最长时间<。
另外,我可能不需要指出这一点,但是你的素数方法非常低效,并且真的很长时间来生成你认为需要的数字。问题