On Wed, Aug 31, 2011 at 12:31 AM, John Carr <[email protected]> wrote: > # let f () = assert false; 0;; > Warning 21: this statement never returns (or has an unsound type.) > val f : unit -> int = <fun>
> Assert behaves like a function with type bool -> 'a. The return type is > an unconstrained type, a type variable not mentioned on the left hand > side of the arrow. Actually, assert is more like a function with type bool -> unit. Indeed, (assert false) is a special case where it is "so obvious that it'll raise an exception that it's made type 'a". Notably, if you write assert(1=2) it's not "obvious enough" for the compiler to assume it will raise an exception. (Which is normal, by the way, because it's generally an undecidable problem: in general, it's not possible to know that the evaluation of assert's argument will return a value, especially when there is a function application such as in "1=2".) So, in let f () = assert false f : unit -> 'a let f () = assert (1=2) f : unit -> unit And while let f () = assert false; 0;; raises a warning, let f () = assert (1=2); 0;; won't raise any. Somehow, the choice of discriminating (assert false) is not so perfect... Cheers, -- Philippe Wang N.B. Sorry for double-replying. I wonder if "reply-to: [email protected]" field could be added automatically to headers of all mails received by the list... -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs
