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 HAA25472; Sun, 21 Mar 2004 07:21:50 +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 HAA25125 for ; Sun, 21 Mar 2004 07:21:49 +0100 (MET) Received: from swordfish.cs.caltech.edu (swordfish.cs.caltech.edu [131.215.44.124]) by concorde.inria.fr (8.12.10/8.12.10) with ESMTP id i2L6LmHd014089 for ; Sun, 21 Mar 2004 07:21:48 +0100 Received: from orchestra.cs.caltech.edu (orchestra.cs.caltech.edu [131.215.44.20]) by swordfish.cs.caltech.edu (Postfix) with ESMTP id 69B16DF298 for ; Sat, 20 Mar 2004 22:21:46 -0800 (PST) Received: by orchestra.cs.caltech.edu (Postfix, from userid 2554) id BE7D29BBA2; Sat, 20 Mar 2004 22:21:43 -0800 (PST) From: Michael Vanier To: caml-list@inria.fr Subject: [Caml-list] extensible records again Message-Id: <20040321062143.BE7D29BBA2@orchestra.cs.caltech.edu> Date: Sat, 20 Mar 2004 22:21:43 -0800 (PST) X-Miltered: at concorde by Joe's j-chkmail ("http://j-chkmail.ensmp.fr")! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; vanier:01 mvanier:01 extensible:01 extensible:01 floats:01 mli:01 val:01 foo:01 val:01 foo:01 ints:01 ocaml:01 mutable:01 mutable:01 variants:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk X-Status: X-Keywords: X-UID: 276 Hi everyone, I sent some email to this list a while back asking for advice on how to handle a problem which called for extensible records. I got some good suggestions involving polymorphic variants, but it turns out that the best proposed solution won't work because of problems with polymorphic references. I'll recap the problem here and (once again) ask for advice from the experts. I've written a dynamically-typed language in ocaml, and I want to be able to add new types to the language without having to add new primitive types to the system. So, for instance, my basic type definition looks something like this: type data = Int of int | Float of float | ... Now I want to add a type for (say) files. I don't want this to be a type at the same level as ints or floats, because I want users to be able to add their own types to the language without hacking the core type definition. I can do this as follows: (* types.mli *) type data = Int of int | Float of float | ... | Extension of exn (* files.ml *) exception File of out_channel let close (d : data) = match data with Extension ext -> (match ext with File f -> (* close the file *) | _ -> raise (Failure "invalid type"))) | _ -> raise (Failure "invalid type") This is OK, but it abuses the exception system. I asked for ways to get the same result with polymorphic variants. A suggested approach (thanks to Aleksey Nogin) was this: # type 'a data = Int of int | Ext of 'a;; type 'a data = Int of int | Ext of 'a # let open_file f = match f with Ext `File f -> print_string ("Opening file" ^ f) | _ -> raise (Invalid_argument "open_file") ;; val open_file : [> `File of string] data -> unit = # let run ( f : [> ] data -> unit) = f (Ext (`Foo 1));; val run : ([> `Foo of int] data -> unit) -> unit = # run open_file;; Exception: Invalid_argument "open_file". So I tried this. Aside from the pain of having to change data to 'a data in lots of places (which I can live with), I got bitten by the polymorphic reference limitation. Specifically, I have a mutable stack of data values which became a mutable stack of 'a data values, but the function which creates the mutable stack is of type '_a data, so it doesn't type check. I can't figure out any way around this. Basically, my main data type _cannot_ be parameterized. I would like to be able to say something like # type data = Int of int | Ext of [> ];; Unbound type parameter [..] but this doesn't work either, as you can see. Is there any way to get the effect that I want? Thanks in advance, Mike ------------------- 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