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