type f<`a, `b> = { apply : `a -> `b } fun : int -> int f (x : int) = x + 1 let boxed_f : f = { apply = f } fun : [`a, `b] f<`a, `b> * `a -> `b apply_boxed_f ((boxed_f : f<`a, `b>), (a : `a)) = boxed_f.apply<`a, `b> (a) let main : int = apply_boxed_f(boxed_f, 42)