Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*
- https://blog.lighty.ch/2020/07/20/fpe-05-generalized-generator/
- *)
- type 'a gen = Gen of 'a * (unit -> 'a gen)
- let rec counter i : int gen = Gen (i, fun () -> counter (i + 1))
- let take n gen =
- let rec take_iter n (Gen (v, f)) acc =
- if n = 0 then acc else take_iter (n - 1) (f ()) (acc @ [ v ])
- in
- take_iter n gen []
- let _ = take 10 (counter 1)
- let iterate fn =
- let rec gen from = Gen (from, fun () -> gen (fn from)) in
- gen
- let inc x = x + 1
- let _ = take 10 (iterate inc 0)
- let generate gn fn =
- let rec gen from = Gen (gn from, fun () -> gen (fn from)) in
- gen
- let fact x =
- let rec fact_iter x acc =
- if x = 0 then acc else fact_iter (x - 1) (x * acc)
- in
- fact_iter x 1
- let _ = take 10 (generate fact inc 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement