exception Libre of var let find_type_var x env = try List.assoc x env with Not_found -> raise (Libre x) let rec infer env a = match a with | Const n -> tint | Prim (f, al) -> let f = find_type_var f.name env in let r = tvar() in let rec targs = function [] -> r | a:: rest -> tarrow (infer env a) (targs rest) in unify f (targs al); r | Var x -> find_type_var x env | App (a1, a2) -> let t1 = infer env a1 in let t2 = infer env a2 in let t3 = tvar() in unify t1 (tarrow t2 t3); t3 | Fonction (x, a) -> let t1 = tvar() in let t2 = infer ((x, t1)::env) a in tarrow t1 t2 | Liaison (x, a1, a2) -> let t1 = infer env a1 in let t2 = infer ((x, t1)::env) a2 in t2 ;;