type ('a, 'b) pair = Pair of 'a * 'b
let ['c] (id : 'c -> 'c) = ['c] fun (x : 'c) -> x[]
let
['e 'd] (fst : ('d,'e) pair -> 'd) =
  ['e 'd] fun (x_1 : ('d,'e) pair) -> match x_1[] with Pair['d, 'e](a, _) -> a[]
let
['g 'f] (snd : ('f,'g) pair -> 'g) =
  ['g 'f] fun (x_2 : ('f,'g) pair) -> match x_2[] with Pair['f, 'g](a_1, b) -> b[]
let (a_2 : int) = fst[int, int] (Pair[int, int] (0, 1))