бесконечный интовый список datatype IntList CONS of int unit IntList N

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(*"бесконечный" интовый список*)
datatype IntList = CONS of int * (unit -> IntList) | NIL
(*получить натуральные числа начиная с k*)
fun NaturalNums k = CONS (k, fn() => NaturalNums(k + 1))
(*фильтр для "бесконечной" последовательности*)
fun filter pred NIL = NIL
| filter pred (CONS (x, xf)) =
if pred x then CONS (x, fn() => filter pred (xf()))
else filter pred (xf());
(*вернуть фильтр для просеивания по простому числу p*)
fun sift p = filter (fn n => n mod p <> 0);
(*собственно решето Эратосфена*)
fun sieve (CONS(p, xf)) = CONS(p, fn() => sieve(sift p (xf())))(*лаконичненько*)
(*выбрать первые N значений "бесконечного" списка*)
fun take (xq, 0) = nil
| take (NIL, n) = nil
| take (CONS (x, xf), n) = x :: take (xf(), n - 1)
(*печатка*)
fun printList (x::xs) = (print ((Int.toString x) ^ " "); printList xs)
| printList nil = ()
(*main*)
val primes = sieve (NaturalNums 2);
printList (take (primes, 10));