From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id 3CB17BB81 for ; Sun, 5 Mar 2006 10:30:01 +0100 (CET) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id k259U029014875 for ; Sun, 5 Mar 2006 10:30:00 +0100 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 KAA11455 for ; Sun, 5 Mar 2006 10:29:59 +0100 (MET) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.200]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id k259Tw7r005506 for ; Sun, 5 Mar 2006 10:29:59 +0100 Received: by wproxy.gmail.com with SMTP id 69so380385wri for ; Sun, 05 Mar 2006 01:29:58 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references; b=eT3PuHHXF3UGlfxhhYxtUAj4ckqlwhN0Y2B3xKB+nJ/mwZeTfnzM5iO0ulvDCW0g6Zm/JVziEuyiNbCxuu/Wei32JHjaXsR5dBJatL1JuNTM/tWTuyn3F6uKQ/6dRBYHOQToM47CzA972WD16u8uciiHeDwq4nxjHNn/qgpf6xM= Received: by 10.65.212.3 with SMTP id o3mr2099861qbq; Sat, 04 Mar 2006 21:31:53 -0800 (PST) Received: by 10.65.22.17 with HTTP; Sat, 4 Mar 2006 21:31:53 -0800 (PST) Message-ID: Date: Sun, 5 Mar 2006 18:31:53 +1300 From: "Jonathan Roewen" To: "David Powers" Subject: Re: [Caml-list] Looking for suggestions on self-referential object definitions Cc: caml-list@inria.fr In-Reply-To: <440A6D81.9020005@grayskies.net> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline References: <20060304143608.GA16996@ours.starynkevitch.net> <440A6D81.9020005@grayskies.net> X-Miltered: at concorde with ID 440AAF98.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at nez-perce with ID 440AAF97.001 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; caml-list:01 val:01 mutable:01 val:01 mutable:01 printf:01 sprintf:01 printf:01 sprintf:01 recursive:01 weapon:98 weapon:98 .....:98 .....:98 inherit:01 X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_BY_IP autolearn=disabled version=3.0.3 > class virtual item =3D > object (self) > val mutable name =3D "" > > method name =3D name > > method set_name newname =3D name <- newname > end > ;; > > > class weapon =3D > object (self) > inherit item > end > ;; > > > class container =3D > object (self) > inherit item > > val mutable items =3D [] > > method add newitem =3D items <- (newitem :: items) > > method contents =3D items > > method remove i =3D items <- List.filter (fun x -> x !=3D i) items > > method contents_to_string =3D > let print_item i =3D > match i with > | `Weapon w -> Printf.sprintf "%s (weapon)" w#name > | `Container c -> Printf.sprintf "%s (container) - > Containing:\n%s" c#name c#contents_to_string > in > List.map print_item items > > end > ;; First off, method contents_to_string has conflicting types to be recursive. Second, adding a type constraint to items should fix your problems. My changes: class container =3D ..... val mutable items : [ `Weapon of weapon | `Container of container ] list =3D [] ... method contents_to_string =3D ..... List.fold_left (fun a b -> if a =3D "" then print_item b else a ^ "; " ^ print_item b) "" items end ;; Jonathan