Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Polymorphic graph widget problem
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Remi Vanicat <vanicat@l...>
Subject: Re: [Caml-list] Polymorphic graph widget problem
Richard Jones <rich@annexia.org> writes:

> As part of a project I'm doing at the moment, I've written a Gtk graph
> widget using lablgtk. The graph currently plots ints, so the type
> looks something like this:
>
> class chart :
>   ?width:int ->
>   ?height:int ->
>   ?packing:(GObj.widget -> unit) ->
>   ?show:bool ->
>   int array ->  (* the data being plotted *)
>   object
>     method repaint : Gdk.Rectangle.t option -> unit
>   end
>
> All fine, but now I'd like to generalise this so it can plot floating
> point values as well as int, thus:
>
> class ['a] chart :
>   ?width:int ->
>   ?height:int ->
>   ?packing:(GObj.widget -> unit) ->
>   ?show:bool ->
>   'a array ->  (* the data being plotted *)
>   object
>     method repaint : Gdk.Rectangle.t option -> unit
>   end
>
> The problem with this is that at various places in the implementation
> we need to break the polymorphism. eg. To plot Y labels we call
> 'string_of_int', and to work out the height of the Y axis we do some
> sums on the values using the (+) operator.
>
> What I need is some way to isolate the parts which break the
> polymorphism.  How do I do that?

Well, as defined, your class should work not only on int and real but
also on string, Array of file descriptor, or whatever. It seem hard. 

In fact, you need to give to your class not only the data, but also
the function for manipulating those data :

class ['a] chart :
   ?width:int ->
   ?height:int ->
   ?packing:(GObj.widget -> unit) ->
   ?show:bool ->
   'a array ->  (* the data being plotted *)
   ('a -> string) -> (* a function to have the string representation
                        of the data *)
   ('a -> int) -> (* a function to have an aproximation of the data *)
   object
     method repaint : Gdk.Rectangle.t option -> unit
   end


(well, you might want to choose some other type but you have the idea)

-- 
Rémi Vanicat
vanicat@labri.u-bordeaux.fr
http://dept-info.labri.u-bordeaux.fr/~vanicat

-------------------
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