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 SAA17504; Fri, 19 Sep 2003 18:54:33 +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 SAA27526 for ; Fri, 19 Sep 2003 18:54:32 +0200 (MET DST) Received: from newext.lri.fr (ext.lri.fr [129.175.15.4]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h8JGsV510878 for ; Fri, 19 Sep 2003 18:54:31 +0200 (MET DST) Received: from serveur-mail.lri.fr (serveur-mail [129.175.8.90]) by newext.lri.fr (8.12.10/jtpda-5.4) with ESMTP id h8JGe435017490 ; Fri, 19 Sep 2003 18:40:04 +0200 (MEST) Received: from serveur-demons (mail@serveur-demons [129.175.8.130]) by serveur-mail.lri.fr (8.11.6p2/jtpda-5.3.2) with ESMTP id h8JGe3I19435 ; Fri, 19 Sep 2003 18:40:04 +0200 (MEST) Received: from marche by serveur-demons with local (Exim 3.35 #1 (Debian)) id 1A0OIb-0004U8-00; Fri, 19 Sep 2003 18:40:01 +0200 From: Claude Marche MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Message-ID: <16235.12641.744161.950288@mailhost.lri.fr> Date: Fri, 19 Sep 2003 18:40:01 +0200 To: katre Cc: caml-list@inria.fr Subject: Re: [Caml-list] Subclasses and pattern matching In-Reply-To: <20030919142156.GA30187@henchmonkey.org> References: <20030919142156.GA30187@henchmonkey.org> X-Mailer: VM 7.03 under Emacs 20.7.2 X-MailScanner: Found to be clean X-Loop: caml-list@inria.fr X-Spam: no; 0.00; lri:01 caml-list:01 val:01 val:01 lri:01 paris-sud:01 phoneto:01 91405:01 orsay:01 faxto:01 ocaml:01 inherit:01 inherit:01 int:01 rec:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk >>>>> "katre" == katre writes: katre> Hello again! katre> I'm working on a project where I want to create a list of data, which is katre> all similar but not identical. In other languages with which I am katre> familiar, I would do this with a base class and a few subclasses, as katre> such: katre> [...] katre> However, I want to use pattern matching to go over this list. I'm not katre> sure how this would work in ocaml. My ideal function would look katre> something like this: katre> let rec show_list l = katre> match l with katre> [] -> () katre> | (h ofclass subclass1)::t -> print_string (h#thing()); show_list t katre> | (h ofclass subclass2)::t -> print_string (h#thing2()); show_list t katre> | (h ofclass abstractClass)::t -> print_string ("Unknown object " ^ (h#to_string())); show_list t katre> Is this possible? What would the syntax be? You have to choose between using a union type and then program with pattern matching, or choose classes and then use inheritance. In your case, with classes : class virtual abstractClass = object method virtual to_string : unit -> string method virtual thing : unit -> string end class subclass1 = object inherit abstractClass val i = 0 method thing () = "I'm an integer whose value is " ^ (string_of_int i) method to_string () = "subclass 1" end class subclass2 = object inherit abstractClass val v = 1.0 method thing () = "I'm an float whose value is " ^ (string_of_float v) method to_string () = "subclass 2" end let l = [ (new subclass1 :> abstractClass); (new subclass2 :> abstractClass) ] let show_list = List.iter (fun o -> print_string (o#thing()));; show_list l;; Hope this helps, -- | Claude Marché | mailto:Claude.Marche@lri.fr | | LRI - Bât. 490 | http://www.lri.fr/~marche/ | | Université de Paris-Sud | phoneto: +33 1 69 15 64 85 | | F-91405 ORSAY Cedex | faxto: +33 1 69 15 65 86 | ------------------- 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