Использование потоков:
let f x = Stream.from (fun n -> Some (x * int_of_float (2.0 ** float_of_int n)))
или
let f x =
let next = ref x in
Stream.from (fun _ -> let y = !next in next := 2 * y ; Some y)
Использование пользовательского lazy_list
типа:
type 'a lazy_list =
| Nil
| Cons of 'a * 'a lazy_list lazy_t
let rec f x = lazy (Cons (x, f (2*x)))