素数の無限列生成

ちょっと感動したのでメモ。もうちょっと長いコードかと思っていたらこれでできるんだな。

primes = sieve [2..]
    where sieve (s:ss) = s : sieve (filter (\x -> (mod x s) > 0) ss)

primesってやると割り込みをかけるまで永遠に素数列が表示され続ける。

*Main> primes
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,Interrupted.