* Re: [Caml-list] sum types with objects
2003-11-26 18:42 [Caml-list] sum types with objects Tom Hirschowitz
@ 2003-11-26 13:37 ` Didier Remy
0 siblings, 0 replies; 2+ messages in thread
From: Didier Remy @ 2003-11-26 13:37 UTC (permalink / raw)
To: Tom.Hirschowitz; +Cc: caml-list
Tom Hirschowitz <Tom.Hirschowitz@ens-lyon.fr> writes:
> when trying to implement lists with objects and classes, I run into
> the following issue.
>
> The idea is to define a class type list, parameterized over the type
> 'a of elements, and containing the methods is_nil, hd, tl, map. Then,
> I planned to define two classes nil and cons for building objects of
> type list.
See polymorphic methods in the manual.
http://caml.inria.fr/ocaml/htmlman/manual005.html#ss:polymorphic-methods
Still, you should use fold and not map:
class type ['a] list = object
method is_nil : bool
method hd : 'a
method tl : 'a list
method fold : 'b. ('a -> 'b -> 'b) -> 'b -> 'b
end;;
exception Nil;;
class ['a] nil = object (self : 'a #list)
method is_nil = true
method hd = raise Nil
method tl = raise Nil
method fold f x = x
end;;
class ['a] cons h t = object (self : 'a #list)
method is_nil = false
method hd = h
method tl : 'a list = t
method fold f x = f self#hd (self#tl#fold f x)
end;;
Otherwise, your are trying to define a type abbreviation
type ('a, ...) #list =
< hd : 'a
tl : 'a list
map : 'b. ('a -> 'b) -> ('b) list; ... >
and 'b list = ('b, <>) list
which is not allowed because the parameter of list in the body is not the
same as the one in the declaration. Type inference will enforce 'b = 'a,
which is not what you want.
This is not just a matter of typechecking, though. In particular,
if you had in mind an implementation of class cons of the form
class cons h t =
...
method map f = new cons (f self#hd) (self#tl#map f)
end;;
you would then have problems inheriting, since the constructor "new cons" is
here the one of the class "cons" beeing defined and not the one of a
subclass. Hence, you would also need to abstract cons over the constructor
function of the subclass of cons beeing considered, which becomes closer to
(but still less general than) what fold actually does.
Didier
-------------------
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
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Caml-list] sum types with objects
@ 2003-11-26 18:42 Tom Hirschowitz
2003-11-26 13:37 ` Didier Remy
0 siblings, 1 reply; 2+ messages in thread
From: Tom Hirschowitz @ 2003-11-26 18:42 UTC (permalink / raw)
To: caml-list
Hi all,
when trying to implement lists with objects and classes, I run into
the following issue.
The idea is to define a class type list, parameterized over the type
'a of elements, and containing the methods is_nil, hd, tl, map. Then,
I planned to define two classes nil and cons for building objects of
type list.
The problem arises during the typing of list:
# class type ['a] list = object
method is_nil : bool
method hd : 'a
method tl : 'a list
method map : ('a -> 'b) -> 'b list
end
;;
class type ['a] list =
object
method hd : 'a
method is_nil : bool
method map : ('a -> 'a) -> 'a list
method tl : 'a list
end
The method map has type ('a -> 'a) -> 'a list, which is not what I
want. Trying to explicitely quantify 'b is also wrong, because 'b
escapes its scope.
Does someone know how to make this work?
-------------------
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-11-26 13:32 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-26 18:42 [Caml-list] sum types with objects Tom Hirschowitz
2003-11-26 13:37 ` Didier Remy
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).