Browse thread
oo type question
[
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: | 2008-03-06 (13:18) |
From: | Peng Zang <peng.zang@g...> |
Subject: | Re: [Caml-list] oo type question |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 The problem is that class ['a] store after adding o1 only accepts objects that have both an id method AND a hi method. So to make it work you need to do something like this: let o1 = object method id = 1 method hi = "hi" end;; let o2 = object method id = 2 method ho = "ho" end;; class ['a] store = object val mutable ids = [] method add (o: 'a) = ids <- o#id :: ids end;; let s = new store ;; s#add (o1 :> <id:int>);; s#add (o2 :> <id:int>);; Note how I coerce o1 and o2 both to a subtype before adding. Now the problem goes away because to the s#add method o1 and o2 have the same type. BUT, what I think you really want is a polymorphic method, not a polymorphic class. The manual has a decent explanation under polymohrphic methods in the Objects section. So I think you want this: let o1 = object method id = 1 method hi = "hi" end;; let o2 = object method id = 2 method ho = "ho" end;; class store = object val mutable ids = [] method add : 'a. <id:int; ..> as 'a -> unit = fun o -> ids <- o#id :: ids end;; let s = new store ;; s#add o1;; s#add o2;; Peng On Thursday 06 March 2008 07:52:38 am Michael Wohlwend wrote: > I try to do the following: > > I have some objects (all with an id method): > let o1 = object method id = 1 method hi = "hi" end > let o2 = object method id = 2 method ho = "ho" end > > and now: > > class store = object > val mutable ids = [] > method add o = ids <- o#id :: ids > end > > this doesn't work, since the hidden type variable in the argument to add (I > think). But why can't the compiler just set o to be of type < obj:int; ..> > ?. So I try: > class ['a] store = object > val mutable ids = [] > method add (o: 'a) = ids <- o#id :: ids > end;; > > ...but... > > let s = new store ;; > give the type: > val s : < id : '_a; _.. > store = <obj> > > so this doesn't work: > > s#add o1; > s#add o2 > > his expression has type < hi : string; id : int > but is here used with > type < ha : string; id : int > > The second object type has no method ho > > If I define a function, say: > let f o = o#id;; > I get : > val f : < id : 'a; .. > -> 'a = <fun> > so this works: > f o1; f o2 > > > why does this not work with methods? > > cheers > Michael > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.7 (GNU/Linux) iD8DBQFHz+8nfIRcEFL/JewRAm9iAJ9CsOmurw8tI2VUls4noUPN8L0TXgCeN6Zk i0NwtHUdj2XN5lnZbCSbxtw= =MHlA -----END PGP SIGNATURE-----