Haskellでエラトステネスの篩

Haskellで素数のリストを作ってみた。

dropMultiples :: Integral a => a -> [a] -> [a]
--dropMultiples x ys = filter (\z -> 0 /= (mod z x)) ys
dropMultiples x = filter ((0 /=) . (`mod` x))  -- ポイントフリーにしてみたけど微妙?

takePrimes :: Integral a => [a] -> [a]
takePrimes []     = []
takePrimes (x:xs) = x : (takePrimes $ dropMultiples x xs)

primes :: Integral a => [a]
primes = takePrimes [2..]

main :: IO ()
main = print $ take 10 primes

エラトステネスの篩をかなり安直に書いただけ。 とりあえず10個目まで出力。

こんな愚直な実装でも無限に計算できる訳で、遅延評価ってのは凄いねぇ。