# type 'a seq = Cons of 'a * (unit -> 'a seq);;
type 'a seq = Cons of 'a * (unit -> 'a seq)
# let rec from n = Cons (n, fun () -> from (n+1));;
val from : int -> int seq = <fun>
# let rec take n (Cons (x, f)) =
if n > 0 then x :: take (n-1) (f [])
else [];;
# take 5 (from 2);;
- : int list = [2; 3; 4; 5; 6]
# let fib =
let rec f x y () = Cons (x, f (x+y) x) in
Cons (1, f 1 1);;
val fib : int seq = Cons (1, <fun>)
# take 10 fib;;
- : int list = [1; 1; 2; 3; 5; 8; 13; 21; 34; 55]
# let prime =
let rec prime_seq primes x () =
let rec is_prime = function
[] -> true
| p :: ps -> p * p > x || (x mod p <> 0 && is_prime ps)
in if is_prime primes
then Cons (x, prime_seq (primes @ [x]) (x+2))
else prime_seq primes (x+2) ()
in Cons (2, prime_seq [2] 3);;
val prime : int seq = Cons (2, <fun>)
# take 10 prime;;
- : int list = [2; 3; 5; 7; 11; 13; 17; 19; 23; 29]
# let rec mapseq f (Cons (x, tail)) =
Cons (f x, fun () -> mapseq f (tail ()));;
val mapseq : ('a -> 'b) -> 'a seq -> 'b seq = <fun>
# let reciprocals = mapseq (fun x -> 1.0 /. float_of_int x) (from 1);;
val reciprocals : float seq = Cons (1., <fun>)
# take 10 reciprocals;;
- : float list =
[1.; 0.5; 0.33333333333333331; 0.25; 0.2; 0.16666666666666666;
0.14285714285714285; 0.125; 0.1111111111111111; 0.1]
# let squares = mapseq (fun x -> x * x) (from 1);;
val squares : int seq = Cons (1, <fun>)
# take 10 squares;;
- : int list = [1; 4; 9; 16; 25; 36; 49; 64; 81; 100]