(*** Eratosthenes sieve by division ***) use"streams"; fun filter P s = let fun auxfilter s = let val h = head s in if P h then cons( fn() => ( h , auxfilter(tail s) ) ) else auxfilter( tail s ) end in auxfilter s end ; fun sieve s = let val h = head s val sift = filter (fn n => n mod h <> 0) ; in cons( fn() => ( h , sieve( sift (tail s) ) ) ) end ; fun from n = cons( fn () => ( n , from(n+1) ) ) ; val primes = sieve( from 2 ) ; take 22 primes ;