caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Re: [Caml-list] Re: OO programming
@ 2008-02-21 16:59 Tiphaine.Turpin
  2008-02-21 19:47 ` Tiphaine.Turpin
  0 siblings, 1 reply; 4+ messages in thread
From: Tiphaine.Turpin @ 2008-02-21 16:59 UTC (permalink / raw)
  To: caml-list

[-- Attachment #1: Type: text/plain, Size: 1 bytes --]



[-- Attachment #2: Re: [Caml-list] Re: OO programming --]
[-- Type: message/rfc822, Size: 3255 bytes --]

From: "Tiphaine.Turpin" <Tiphaine.Turpin@free.fr>
To: Remi Vanicat <vanicat@debian.org>
Subject: Re: [Caml-list] Re: OO programming
Date: Thu, 21 Feb 2008 17:55:49 +0100
Message-ID: <47BDAD15.9020501@free.fr>

Remi Vanicat a écrit :
> something like that might work (from the Dider Remy example)
>
>
> class ['observer] subject =
> object (self : 'mytype)
>   val mutable observers : 'observer list = []
>   method add obs = observers <- obs :: observers
>   method notify (message : 'observer -> 'mytype -> unit) =
>     List.iter (fun obs -> message obs self) observers
> end;;
>
> class ['subject] observer =
> object
>   constraint 'subject = 'a #subject
> end;;
>
> Note that it doesn't solve completely the problem (as #subject is
> still an open type) but it might catch some problem.
>
>   
Thanks for your answer. It seems to be an interesting direction. Here is 
a try to expand the example further, where I assume that messages will 
go through one single method :

class ['observer] subject =
object (self : 'mytype)
  val mutable observers : 'observer list = []
  method add obs = observers <- obs :: observers
  method notify (message : 'message) =
    List.iter (fun obs -> obs#send message self) observers
end

class virtual ['subject, 'message] observer =
object (self : 'self)
  constraint 'subject = 'observer #subject
  method virtual send : 'message -> 'subject -> unit
end

This is still not enough, as I can for example, forget the 'subject 
argument in the type of send, without any type error (at this point). 
However, adding the constraint

  constraint 'observer = (_, _) #observer

in the observer class does the work: if I write

  method virtual send : 'message -> 'subject -> unit

then the class is rejected (with a horrible message, though, which I 
don't reproduce here to avoid hurting the sensibility of inocent ocaml 
users). the two classes seem to be "usable". Still, there is no link 
between the type 'self in the observer, and the type of the observer as 
viewed by the subject. I don't have a precise example in mind, but I 
feel that something is missing.

A stronger possibility (which doesn't work) is to add the following 
constraint instead :

  constraint 'observer = 'self

The class is rejected and I even get an understandable message:

    method virtual send : 'message -> unit
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The method send has type 'a -> unit but is expected to have type
  'a -> < send : 'b; .. > #subject -> unit as 'b

However, this constraint seems to be too restrictive, since, as I 
understand, it forces the subject to know the exact type of the 
observers which prevents (at least in my first tries) to add to a same 
subject different sub-classes of observer (or maybe I'm not using the 
right coercion).

let s = new subject
let o = object inherit [_, _] observer method send _ _ = () method foo = 
() end
let _ = s#add (o :> (_, _) observer)

=> long  complicated message


Tiphaine Turpin



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-02-22 13:56 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-21 16:59 [Caml-list] Re: OO programming Tiphaine.Turpin
2008-02-21 19:47 ` Tiphaine.Turpin
2008-02-21 23:56   ` Julien Moutinho
2008-02-22 13:52     ` Tiphaine.Turpin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).