Excerpts from Julien SIGNOLES's message of Wed Jan 28 15:24:14 +0100 2009: > Le mercredi 28 janvier 2009 à 14:07 +0000, Matthieu Wipliez a écrit : > > > Hello, > > > > > > Is it a bug or a well-known feature that the above program does not emit > > > a warning (because "f x" should have type unit in the body of "g") ? > > > > > > ===== > > > let f x = x > > > let g x = f x; 1 > > > (* let _ = g 2 *) > > > ==== > > > > I'm not familiar with the internals of the compiler, but what I suppose is > > happening is that it tries to unify the type of "f x" and "unit", and this > > succeeds because "f x" has type 'a, which can be unified with anything. The > > meaning of "a;b" seems to be let _ = a in b rather than let () = a in b. > > > > But like I said, these are suppositions. > > Sure. However in my real case, I had an "ok" code like this : > > let f x : 'a -> unit = ... > let g x = > f x; > x > > I changed a little bit the specification of f : > > let f x : 'a -> 'a = ... > > I just expected that caml helps me to find all the instances where I had > to take care of this specification change. Such a thing is one of the > very good features of caml. Unfortunatly, in this case, caml did not > help me while the old implementation of "g" became wrong with the new > specification of "f" :-(.
That's because (let f x : 'a -> 'a = ...) is not a specification for a polymorphic function, this is rather an existential quantification than a universal one. They are some ugly tricks to ensure a polymorphic function, like this one: module M : sig val f : t -> 'a -> 'a end = struct let f x = ... end include M Best regards, -- Nicolas Pouillard _______________________________________________ Caml-list mailing list. Subscription management: http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list Archives: http://caml.inria.fr Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs