caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: jhw@wetware.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Re: Phantom types (very long)
Date: Fri, 14 Sep 2001 17:49:22 +0900	[thread overview]
Message-ID: <20010914174922Y.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <25775F60-A6E4-11D5-9E93-000502DB38F5@mac.com>

> This "phantom types" design pattern is one I have never seen before.  It 
> doesn't seem to be used in the standard library anywhere I can see.  It 
> looks like it might be useful in presenting a safer network programming 
> interface than the low-level wrappers around BSD sockets (which I've 
> never liked).

Thay are used in both Bigarray and Labltk (the 'a widget type). In
fact they were already used in Labltk before the word phantom started
to be used for them.

> Are there any other mind-blowingly elegant design patterns lurking in 
> the corners of the Caml type inference engine that I should know about?

I don't know if this is mind blowing, but thanks to variance
annotations on abstract types, you can also have subtyping on
"phantom" types. This is used in lablgtk for instance:

type (-'a) gtkobj
type widget = [`widget]
type container = [`widget|`container]
type box = [`widget|`container|`box]

now you can cast safely between classes:
    (mybox : box gtkobj :> container gtkobj)

Note that the parameter must be contravariant if you use polymorphic
variant types as indexes, or covariant if you rather use object types.

This also works ok with polymorphism, encoding inheritance (even
multiple) in a direct way.
val add : [> `container] gtkobj -> [> `widget] gtkobj -> unit

Cheers,

        Jacques Garrigue
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


  parent reply	other threads:[~2001-09-14 12:53 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-09-07 18:35 [Caml-list] opaque polymorphism Charles Martin
2001-09-10  7:02 ` Francois Pottier
2001-09-10 23:19   ` Phantom types (very long) (Was Re: [Caml-list] opaque polymorphism) Brian Rogoff
2001-09-11  9:44     ` Andreas Rossberg
2001-09-11 18:38     ` [Caml-list] Re: Phantom types (very long) j h woodyatt
2001-09-11 19:16       ` Brian Rogoff
2001-09-12  9:33       ` Daan Leijen
2001-09-14  8:49       ` Jacques Garrigue [this message]
2001-09-14 19:10         ` Brian Rogoff

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20010914174922Y.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=jhw@wetware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).