type nat = Zero | S of nat;;

let rec take_l n xs =
  match Lazy.force xs with
  | [] -> []
  | x::xs' ->
     match n with
     | Zero -> []
     | S(n') -> x::take_l n' xs'
;;

let rec zeros = lazy Zero:: zeros
;;

let main n zeros = take_l n zeros;;