エラトステネスのふるいを実装する次のコードがあります。
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 = print (sum [p | p <- primes, p < 100000]))
当然のことながら、これは、pを無限リストの素数のすべての要素と比較する必要があるためにハングします。素数が昇順であることがわかっているので、上限を超える要素を見つけたらすぐに無限リストを切り捨てるにはどうすればよいですか?
ps理論的には、素数は入力リストをフィルタリングして素数のリストを返します。リストを2以外で開始すると、いくつかの問題が発生することはわかっています。この問題に自分で対処する方法についてはまだ取り組んでいるので、ネタバレしないでください。ありがとう ;-)