let best_matching_signature data actuals funcs =
let funcs = List.filter (compatible_function data actuals) funcs in
let distance_of actual formal = match get_distance data actual formal with
| Some(n) when n >= 0 -> n
| _ -> raise(Invalid_argument("Compatible methods somehow incompatible: " ^ actual ^ " vs. " ^ formal ^ ". Compiler error.")) in
let to_distance func = List.map2 distance_of actuals (List.map fst func.formals) in
let with_distances = List.map (fun func -> (func, to_distance func)) funcs in
let lex_compare (_, lex1) (_, lex2) = lexical_compare lex1 lex2 in
List.map fst (find_all_min lex_compare with_distances)