(*"бесконечный" интовый список*) 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));