uhm, I have a couple of questions I don't understand on your
explanation:
- why the most general type is int->'a and not 'a -> 'b?

Because if I need a function of type int -> 'a I can give a function of type 'a -> 'b.
But if I need a function of type 'a -> 'b I can not use a function of type int -> 'a.
So int -> 'a is more general and 'a -> 'b is more specific.

General rule : if a < b then (a->c) > (b->c) 

- does this mean that I can't have a general type that could be matched
  by 'a -> 'a list -> 'a list  and int -> int -> int ?


if you want to get a supertype of a -> b and c -> d you need to
find a subtype of a and c AND find a supertype of b and d.

So for example for ('a -> ( 'a list -> 'a list)) and (int -> (int -> int))
you need
 - a subtype of 'a and int : it's int. you have one.
 - a supertype of ('a list -> 'a list) and (int -> int) (reapply the same procedure)
      -a subtype of 'a list and int : there is no such thing in ocaml, so there is no supertype.

So to answer your question, you can't. But as Jacques Garrigue said, you don't need either,
and you can use abstract type and "with type" construction.




Walter

--