From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id WAA30005; Sun, 14 Dec 2003 22:38:31 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id WAA29964 for ; Sun, 14 Dec 2003 22:38:29 +0100 (MET) Received: from rabelais.socialtools.net (rabelais.socialtools.net [81.2.94.243]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id hBELcRr07312 for ; Sun, 14 Dec 2003 22:38:27 +0100 (MET) Received: by rabelais.socialtools.net (Postfix, from userid 108) id BFADB2332A; Sun, 14 Dec 2003 21:38:26 +0000 (GMT) Received: from socialtools.net (chaucer.socialtools.net [81.2.94.242]) by rabelais.socialtools.net (Postfix) with ESMTP id A09D3232DA; Sun, 14 Dec 2003 21:38:25 +0000 (GMT) Message-ID: <3FDCD850.9090005@socialtools.net> Date: Sun, 14 Dec 2003 21:38:24 +0000 From: Benjamin Geer User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007 X-Accept-Language: en-gb, en, fr, it MIME-Version: 1.0 To: Jean-Baptiste Rouquier Cc: "caml-list@inria.fr" Subject: Re: [Caml-list] polymorphic function not recognised as such References: <3FDCB684.5000203@socialtools.net> <3FDCC2A8.2090901@ens-lyon.org> In-Reply-To: <3FDCC2A8.2090901@ens-lyon.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 2.61 (1.212.2.1-2003-12-09-exp) on rabelais.socialtools.net X-Spam-Status: No, hits=-4.9 required=5.0 tests=BAYES_00 autolearn=ham version=2.61 X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 checker:01 char:01 char:01 checker:01 inferred:01 monomorphic:01 inference:01 compiler:01 bool:01 bool:01 int:01 int:01 polymorphic:01 polymorphic:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Jean-Baptiste Rouquier wrote: > compare_things : thing -> thing -> ('a -> 'a -> bool) -> bool > doesn't mean that comparison_fun has to be polymorphic, but it means > that any function with type ('a -> 'a -> bool), where 'a is any type, is > acceptable. For instance, the type checker would accept a function of > the type (char -> char -> bool). OK, but it seems that the type checker has inferred the type of comparison_fun just by looking at its first use in compare_things, and has decided that it must be monomorphic; this is an incorrect inference. My naive impression is that if the type checker was willing to accept both uses of comparison_fun as valid (or perhaps if it also looked at the places where compare_things is called), it would conclude that comparison_fun does indeed have to be polymorphic. In that case, I would get a compile error if I tried to pass a non-polymorphic function to compare_things. Would this be this asking too much? (I suspect the answer is yes; I'm just curious...) Ben > [...] > Benjamin Geer wrote: > >> Can anyone explain to me why the following doesn't compile: >> >> ---------- >> >> type thing = Int of int | String of string ;; >> >> let int_of_thing t = >> match t with >> Int i -> i >> | String s -> int_of_string s ;; >> >> let string_of_thing t = >> match t with >> Int i -> string_of_int i >> | String s -> s ;; >> >> let compare_things t1 t2 comparison_fun = >> match (t1, t2) with >> (Int i, _) -> comparison_fun i (int_of_thing t2) >> | (String s, _) -> comparison_fun s (string_of_thing t2) ;; >> >> let is_less_than t1 t2 = >> compare_things t1 t2 (<) ;; >> >> let is_greater_than t1 t2 = >> compare_things t1 t2 (>) ;; >> >> ---------- >> >> The compiler says: >> >> File "test.ml", line 16, characters 38-39: >> This expression has type string but is here used with type int >> >> It seems to have decided that in the function compare_things, >> comparison_fun is int -> int -> 'a because that's how it's used in the >> first pattern, not realising that I mean to pass a polymorphic >> function, 'a -> 'a -> bool. >> >> Is there a way to make this work? (Specifying the type of >> comparison_fun as 'a -> 'a -> bool makes no difference.) >> >> Ben ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners