Browse thread
Benchmarks against imperative languages
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2006-03-05 (09:30) |
From: | Jonathan Roewen <jonathan.roewen@g...> |
Subject: | Re: [Caml-list] Looking for suggestions on self-referential object definitions |
> class virtual item = > object (self) > val mutable name = "" > > method name = name > > method set_name newname = name <- newname > end > ;; > > > class weapon = > object (self) > inherit item > end > ;; > > > class container = > object (self) > inherit item > > val mutable items = [] > > method add newitem = items <- (newitem :: items) > > method contents = items > > method remove i = items <- List.filter (fun x -> x != i) items > > method contents_to_string = > let print_item i = > 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 = ..... val mutable items : [ `Weapon of weapon | `Container of container ] list = [] ... method contents_to_string = ..... List.fold_left (fun a b -> if a = "" then print_item b else a ^ "; " ^ print_item b) "" items end ;; Jonathan