2 type t
= [`A
of int | `B
of string | `Z
of t
]
4 let rec use_t = function
6 | `B s
-> String.length s
10 : t
-> unit (* comment this *)
12 | `A i
-> print_endline
"A"
13 | `B s
-> print_endline
"B"
14 | `Z x
-> (print_string
"Z"; show_t x
)
16 let rec make_narrow = function
18 | `B s
-> `A
(String.length s
)
19 | `Z x
-> `Z
(make_narrow x
)
21 let rec use_narrow = function
23 | `Z x
-> (use_narrow x
)
28 let y = make_narrow x
in
32 let final x
= use_narrow (make_narrow (tee show_t x
))
35 use_narrow (tee (fun z
-> show_t z
) (make_narrow x
))