Some examples for type inference algorithm
let add5 x = 5 + x;;
let add_pair x = fst x + snd x;;
let switch_pair x = (snd x, fst x);;
(* what is this?? *)
let f x = ((fst x) + 1) :: snd x;;
(* and this?? *)
let f x = (fst x + snd x) :: x;;
(*recursive functions*)
let rec count x = match x with
[] -> 0
|y::ys -> 1 + count ys;;
let rec remove x y = match y with
[] -> []
|z::zs -> if z = x then remove x zs else z::remove x zs;;
(* to test remove and count on functions*)
let f x = x;;
(* count works on lists of any type *)
count [3; 6; 8];;
count [f; f];;
(* remove works on non-function types *)
remove 2 [3; 2; 4; 2];;
(* this breaks at run-time since functions are not comparable: *)
remove f [f; f];;
(* this works, proving that the error happens at function comparison. *)
(* no function comparison -- no error: *)
remove f [];;
CSci 4651 course.