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 PAA23171; Sun, 11 Apr 2004 15:16:29 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id PAA23120 for ; Sun, 11 Apr 2004 15:16:27 +0200 (MET DST) Received: from kurims.kurims.kyoto-u.ac.jp (kurims.kurims.kyoto-u.ac.jp [130.54.16.1]) by nez-perce.inria.fr (8.12.10/8.12.10) with ESMTP id i3BDHMjq019321 for ; Sun, 11 Apr 2004 15:17:24 +0200 Received: from localhost (suiren.kurims.kyoto-u.ac.jp [130.54.16.25]) by kurims.kurims.kyoto-u.ac.jp (8.9.3p2-20030924/3.7W) with ESMTP id WAA15972; Sun, 11 Apr 2004 22:16:19 +0900 (JST) To: rich@annexia.org Cc: caml-list@inria.fr Subject: Re: [Caml-list] Fwd: Polymorphic optional label argument, with default In-Reply-To: <20040411083357.GA19305@redhat.com> References: <20040410213616.GA28863@redhat.com> <20040411083357.GA19305@redhat.com> X-Mailer: Mew version 1.94.2 on Emacs 21.2 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20040411221619G.garrigue@kurims.kyoto-u.ac.jp> Date: Sun, 11 Apr 2004 22:16:19 +0900 From: Jacques Garrigue X-Dispatcher: imput version 20000228(IM140) X-Miltered: at nez-perce by Joe's j-chkmail ("http://j-chkmail.ensmp.fr")! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 jacques:01 2004:99 floats:01 passing:01 compile-time:01 endline:01 val:01 foo:01 val:01 endline:01 api:01 200102:01 omitted:01 struct:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk X-Status: X-Keywords: X-UID: 253 From: Richard Jones > On Sun, Apr 11, 2004 at 01:26:24AM -0500, Brian Hurt wrote: > > > plot : ?labels : ('a -> string) -> (* ... 'a ... *) -> unit > > > > > > [The 'a types are the same type. If I leave out the initializer, then > > > it works.] > > > > I don't think it's possible. Consider the following situation: I pass in > > a graph of floats for example, and then forget to specify a labels > > argument. Now you're passing a float to string_of_int. > > I'd want this to generate a compile-time error, because the 'a 's > aren't the same. > > It's perfectly possible to define this function if one leaves out the > default argument, or sets the default argument to a function typed as > 'a -> string. > > # let plot ~labels graph = print_endline (labels graph);; > val plot : labels:('a -> string) -> 'a -> unit = > > or: > > # let string_of_any x = "foo";; > val string_of_any : 'a -> string = > # let plot ?(labels = string_of_any) graph = print_endline (labels graph);; > val plot : ?labels:('a -> string) -> 'a -> unit = > > But not if I want the default to be the most common case (which is > that my graph will be a graph of ints). I want the common case in > there so that most of the time end users of the API won't need to > worry about ~labels and optional arguments. What you are asking for has already been discussed on this list, a few years ago. Here is my answer at that time: http://caml.inria.fr/archives/200102/msg00212.html Basically, what you are asking for is a new type of constraint, which is only to be applied when the optional argument is omitted (and as result the default is selected). This is not possible in the current type system, and while there are some uses for that, it would be hard to justify making types more complex in the general case, just to handle this specific problem. Note that there is an encoding, which does not provide optional arguments, but just a way to handle this kind of default in an explicit way. module Opt : sig type ('a,'b) t val omit : ('a,'a) t val arg : 'a -> ('a,'b) t val get : default:'b -> ('a,'b) t -> 'a end = struct type ('a,'b) opt = Omit | Arg of 'a let omit = Omit let arg x = Arg x let get ~default = function Omit -> Obj.magic default | Arg x -> x end Note that the typing makes this use of Obj.magic OK. Then your function may be defined to take as argument either Opt.omit or (Opt.arg f). This probably doesn't solve your problem, but this may help you to see the issues involved. Jacques Garrigue ------------------- 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