fun : [`a, `b] `a * `b -> `a
      fst ((x : `b), (y : `a)) = x

let main : int =
    fst<int, char> (37, 'a')