Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: david.chemouil@irit.fr
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] phantom types and coercions
Date: Wed, 03 Oct 2001 23:17:53 +0900	[thread overview]
Message-ID: <20011003231753S.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <3BBAD886.3CCB5AC4@irit.fr>

From: David Chemouil <david.chemouil@irit.fr>

> we have noticed a strange (at least to us) behavior of the coercion
> operator over phantom types.
> 
> Here is an example:
> 
> # type n = [`Pos];;   (* non-negative number *)
> type n = [ `Pos]
> # type z = [`Neg | `Pos];;   (* integer *)
> type z = [ `Neg | `Pos]
> # type (+'ph) expr = Expr of int;;  (* phantom type *)
> type 'a expr = Expr of int

The problem is that this is not a phantom type. To be more precise, in
ocaml only abstract types behave as phantom types. Citing the
reference manual:

  The variance indicated by the + and - annotations on parameters are
  required only for abstract types. For abbreviations, variant types or
  record types, the variance properties of the type constructor are
  inferred from its definition, and the variance annotations are only
  checked for conformance with the definition.

You can see that the "+" does not appear in the output of the
compiler. In fact 'ph is "anyvariant", since it does not appear in the
type itself.

This behaviour is natural, since you would be able to fool the
compiler by matching Expr, and building a new one.

On the other hand, you can build a small ADT to get a real phantom
type.

module Expr : sig
  type +'a expr
  val pos_expr : int -> [`Pos] expr
  val neg_expr : int -> [`Neg] expr
  val add : 'a expr -> 'a expr -> 'a expr
  val get : 'a expr -> int
end = struct
  type 'a expr = int
  let pos_expr n = if n < 0 then invalid_arg "pos_expr"; n
  let neg_expr n = if n > 0 then invalid_arg "neg_expr"; n
  let add n1 n2 = n1 + n2
  let get n = n
end

Hope this helps,

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


      reply	other threads:[~2001-10-03 14:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-10-03  9:21 David Chemouil
2001-10-03 14:17 ` Jacques Garrigue [this message]

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=20011003231753S.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=david.chemouil@irit.fr \
    /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