Advertisement
kenpusney

gen.ml

Nov 10th, 2022
2,041
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.76 KB | None | 0 0
  1. (*
  2.  https://blog.lighty.ch/2020/07/20/fpe-05-generalized-generator/
  3. *)
  4.  
  5. type 'a gen = Gen of 'a * (unit -> 'a gen)
  6.  
  7. let rec counter i : int gen = Gen (i, fun () -> counter (i + 1))
  8.  
  9. let take n gen =
  10.   let rec take_iter n (Gen (v, f)) acc =
  11.     if n = 0 then acc else take_iter (n - 1) (f ()) (acc @ [ v ])
  12.   in
  13.   take_iter n gen []
  14.  
  15. let _ = take 10 (counter 1)
  16.  
  17. let iterate fn =
  18.   let rec gen from = Gen (from, fun () -> gen (fn from)) in
  19.   gen
  20.  
  21. let inc x = x + 1
  22. let _ = take 10 (iterate inc 0)
  23.  
  24. let generate gn fn =
  25.   let rec gen from = Gen (gn from, fun () -> gen (fn from)) in
  26.   gen
  27.  
  28. let fact x =
  29.   let rec fact_iter x acc =
  30.     if x = 0 then acc else fact_iter (x - 1) (x * acc)
  31.   in
  32.   fact_iter x 1
  33.  
  34. let _ = take 10 (generate fact inc 0)
  35.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement