Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
22
Task/Variadic-function/OCaml/variadic-function-3.ocaml
Normal file
22
Task/Variadic-function/OCaml/variadic-function-3.ocaml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
type 'a variadic =
|
||||
| Z : unit variadic
|
||||
| U : 'a variadic -> (unit -> 'a) variadic
|
||||
| S : 'a variadic -> (string -> 'a) variadic
|
||||
| I : 'a variadic -> (int -> 'a) variadic
|
||||
| F : 'a variadic -> (float -> 'a) variadic
|
||||
(* Printing of a general type, takes pretty printer as argument *)
|
||||
| G : 'a variadic -> (('t -> unit) -> 't -> 'a) variadic
|
||||
| L : 'a variadic -> (('t -> unit) -> 't list -> 'a) variadic
|
||||
|
||||
let rec print : type a. a variadic -> a = function
|
||||
| Z -> ()
|
||||
| U v -> fun () -> Format.printf "()\n"; print v
|
||||
| S v -> fun x -> Format.printf "%s\n" x; print v
|
||||
| I v -> fun x -> Format.printf "%d\n" x; print v
|
||||
| F v -> fun x -> Format.printf "%f\n" x; print v
|
||||
| G v -> fun pp x -> pp x; print v
|
||||
| L v -> fun pp x -> List.iter pp x; print v
|
||||
|
||||
let () =
|
||||
print (S (I (S Z))) "I am " 5 "Years old";
|
||||
print (S (I (S (L (S Z))))) "I have " 3 " siblings aged " (print (I Z)) [1;3;7]
|
||||
Loading…
Add table
Add a link
Reference in a new issue