Typing.infer;;
Typing.infer "hd (cons 1 nil)";;
Typing.infer "hd (cons 1 [])";;
Typing.pmu;;
CoreML.of_string "\\x. x + x";;
CoreML.of_string "\\(x.x + x)";;
CoreML.of_string "\\x.(x + x)";;
CoreML.of_string "\\x.(x +) x";;
CoreML.of_string "\\x.(+ x) x";;
CoreML.of_string "\\x.+ (x x)";;
Typing.to_up;;
Typing.to_up (Typing.pmu, CoreML.of_string "hd (cons 1 nil)", Typing.tvar 0);;
Typing.pmu;;
let up = Typing.to_up (Typing.pmu, CoreML.of_string "hd (cons 1 nil)", Typing.tvar 0);;
Typing.unify up;;
Typing.infer "hd (cons 1 [])";;