[
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: | 2002-08-05 (09:30) |
From: | Jacques Garrigue <garrigue@k...> |
Subject: | Re: [Caml-list] Weak type, Open type |
From: "SooHyoung Oh" <shoh@duonix.com> > While I've studying design pattern with ocaml, > I made the followding 3 classes (PART1): > (1) class virtual entry: base class > (2) class file: subclass of "entry" class > (3) class dir: subclass of "entry" class > > I made some code using these classes on top level and it's ok. (PART 2). > While I translate the top level code into new class definition (PART3), it > makes some error. > The error message is on (PART 4). > > It seems that (PART2) is weak type and (PART 3) is open type. Not weak: file_list has a weak type variable, but it gets immediatly instanciated to entry; and add is really polymorphic. > [Q 1] Is (PART2) is correct? I don't know why it doesn't make type error. Yes. What's wrong? Note that your #entry is meaningless, since it is immediatly instanciated to entry. You could as well write entry list from the beginning, or nothing at all. > [Q 2] (depend on Q 1) > Can I translate (PART2) into new class definition like (PART 3) without type > error? The problem is witht the polymorphism of add. Implicit polymorphism is not allowed in methods. You can either remove the polymorphism, or make it explicit. No polymorphism: class dir2 name = object(self) inherit entry () val file_list = ref ([]: entry list) method name () = name method add e = file_list := e :: !file_list end;; Explicit polymorphism (3.05 only): class dir2 name = object(self) inherit entry () val file_list = ref [] method name () = name method add : 'a. (#entry as 'a) -> unit = fun e -> file_list := (e:>entry) :: !file_list end;; Jacques Garrigue > ============ (PART 1) class definition =============== > class virtual entry () = > object > method virtual name: unit -> string > end;; > > class file name = > object(self) > inherit entry () > method name () = name > method file_size () = 100 > end;; > > class dir name = > object(self) > inherit entry () > method name () = name > method dir_size () = 3000 > end;; > > =============== (PART 2) NO ERROR with weak type (?) =================== > let file_list = ref ([]: #entry list);; > let add e = file_list := (e:>entry) :: !file_list;; > let _ = add (new dir "root");; > let _ = add (new file "hello.txt");; > > ================ (PART 3) ERROR with open type (?) ================ > class dir2 name = > object(self) > inherit entry () > > val file_list = ref ([]: #entry list) > > method name () = name > method add e = file_list := (e:>entry) :: !file_list > end;; > > ================ (PART 4) error message ================ > Some type variables are unbound in this type: > class dir2 : > string -> > object > val file_list : entry list ref > method add : #entry -> unit > method name : unit -> string > end > The method add has type #entry -> unit where .. is unbound > > --- > SooHyoung Oh > tel: 02)583-8709, 042)861-8649 > cell. phone: 011-453-4303 > web: http://www.duonix.com > > > ------------------- > 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 ------------------- 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