5

エラトステネスのふるいを実装する次のコードがあります。

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以外で開始すると、いくつかの問題が発生することはわかっています。この問題に自分で対処する方法についてはまだ取り組んでいるので、ネタバレしないでください。ありがとう ;-)

4

1 に答える 1

18

このような場合、述語が要素に対してfalseを返すと、それ以降の要素に対してtrueを返すことはないことがわかっている場合は、に置き換えることができます。これは、述語が初めてfalseを返すとすぐに要素の取得を停止しますfiltertakeWhile

于 2012-06-07T17:20:02.220 に答える