(* Il tipo degli stream *) type 'a streamCell = Nil | Cons of 'a * 'a stream and 'a stream = 'a streamCell lazy_t;; (* incrementale *) let rec from n = lazy (Cons(n,from (n + 1)));; (* incrementale *) let positive = from 1;; (* incrementale *) let rec append s1 s2 = match (Lazy.force s1) with Nil -> s2 | Cons(x,s) -> lazy (Cons(x,append s s2)) (* incrementale: da' lo stream dei primi n elementi di uno stream *) let rec take n s = match (n,Lazy.force s) with (0,_) -> lazy Nil | (_,Nil) -> lazy Nil | (_,Cons(x,s')) -> lazy (Cons(x,take (n - 1) s'));; (* monolitica: da' lo stream ottenuto eliminando i primi n elementi *) (* di uno stream s *) let rec drop n s = match (n,Lazy.force s) with (0,_) -> s | (_,Nil) -> lazy Nil | (_,Cons(x,s')) -> drop (n - 1) s';; (* monolitica *) let reverse s = let rec reverse_aux s' acc = match (Lazy.force s') with Nil -> acc | Cons(x,s'') -> reverse_aux s'' (lazy (Cons(x,acc))) in reverse_aux s (lazy Nil);; (* incrementale *) let rec multiples_from m n = lazy (Cons(m,multiples_from (m + n) n));; (* incrementale *) let multiples n = multiples_from n n;; (* incrementale: calcola le coppie di numeri positivi diversi a partire *) (* dalla coppia (m,n) *) let rec pairs_from n m = if (m < n) then lazy (Cons((m,n),pairs_from n (m + 1))) else pairs_from (n + 1) 1;; (* tutte le coppie di numeri positivi diversi *) let pairs = pairs_from 2 1;; (* monolitica *) let print s = let rec print_aux s' = match (Lazy.force s') with Nil -> print_string "" | Cons(x,s'') -> match (Lazy.force s'') with Nil -> print_int x | Cons(x',_) -> print_int x; print_string ";"; print_aux s'' in print_string "["; print_aux s; print_string "]" (* monolitica: stampa uno stream di coppie *) let print' s = let rec print_aux s' = match (Lazy.force s') with Nil -> print_string "" | Cons((x,y),s'') -> match (Lazy.force s'') with Nil -> print_string "("; print_int x; print_string ","; print_int y; print_string ")" | Cons(_,_) -> print_string "("; print_int x; print_string ","; print_int y; print_string ")"; print_string ";"; print_aux s'' in print_string "["; print_aux s; print_string "]"