Browse thread
[Caml-list] does class polymorphism need to be so complicated?
[
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: | -- (:) |
| From: | Jacques Garrigue <garrigue@k...> |
| Subject: | Re: [Caml-list] does class polymorphism need to be so complicated? |
From: Benjamin Geer <ben@socialtools.net>
> Benjamin Geer wrote:
> > I'm still curious to know why the example I gave (returning a
> > mysql_connection from a method that was typed to return a #connection)
> > didn't compile, though ("This method has type string -> mysql_connection
> > which is less general than 'a. string -> (#connection as 'a)").
Because #connection is _not_ an interface. It is just a polymorphic
type including all types having more methods than connection.
So returning a #connection means that the returned object already has
all the methods in the world, with all types imaginable. Nonsense.
#connection only makes sense on the left-hand side of an arrow.
By the way, the typing of #connection really uses rows (as by Remy and
later Pottier), but in a simplified way. So the unification Jacques
Carrette is talking about is already there from the beginning of ocaml.
> Curiously, it works if the class is parameterised instead of the method:
>
> class type ['a] driver =
> object
> constraint 'a = #connection
> method get_connection : db_name:string -> 'a
> end
>
> class mysql_driver =
> object (self : 's)
> constraint 's = #connection #driver
> method get_connection ~(db_name:string) =
> new mysql_connection db_name
> end
The meaning is completely different. Your class type says that
get_connection must at least have all methods of connection.
But in mysql_driver, you end up with a get_connection returning a
(monomorphic) mysql_connection. No progress whatsoever.
Jacques Garrigue
-------------------
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