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

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