From: Jeremy Yallop <jeremy.yallop@ed.ac.uk>
To: Dario Teixeira <darioteixeira@yahoo.com>
Cc: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Troublesome nodes
Date: Mon, 14 Jul 2008 20:37:47 +0100 [thread overview]
Message-ID: <487BAB0B.6030000@ed.ac.uk> (raw)
In-Reply-To: <831.74975.qm@web54604.mail.re2.yahoo.com>
Dario Teixeira wrote:
> type ('a, 'b) t = private 'a constraint 'a = [< super_node_t ]
I don't think this is quite what you want yet, although it's getting
close!
The first problem is that phantom types must be implemented in terms
of abstract (or at least generative) types. A simple example to
illustrate the problem: the types
int t
and
float t
denote the same type given the alias declaration
type 'a t = unit
but different types given the abstract type declaration
type 'a t
The clause "= private 'a" in your declaration above indicates that `t'
denotes an alias, not an abstract type.
The second problem is indicated by the error message you reported:
"The type of this expression contains type variables that cannot be
generalized"
Weak (ungeneralised) type variables are not allowed at module-level
bindings. You'll see a similar error message if you try to compile a
module containing the following binding, for example
let x = ref None
The solution to this problem is usually to change the form of the
offending expression, for example by eta-expanding a term denoting a
function. In your case, though, the solution is to change the
declaration of the abstract type `t' to indicate that the type
parameters do not occur negatively in the right-hand side. This takes
advantage of a novel feature of OCaml -- the "relaxed value
restriction" -- which uses a subtype-based analysis rather than a
simple syntactic check to determine whether bindings can be made
polymorphic.
The final type declaration, then, is
type (+'a, +'b) t
constraint 'a = [< super_node_t ]
in the signature and
type (+'a, +'b) t = 'a
constraint 'a = [< super_node_t ]
in the implementation.
Jeremy.
next prev parent reply other threads:[~2008-07-14 19:37 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-11 20:39 Dario Teixeira
2008-07-11 21:20 ` [Caml-list] " Jeremy Yallop
2008-07-12 12:37 ` Dario Teixeira
2008-07-12 13:25 ` Jacques Carette
2008-07-12 16:44 ` Wolfgang Lux
2008-07-12 18:21 ` Dario Teixeira
2008-07-12 18:27 ` Jeremy Yallop
2008-07-12 18:58 ` Jacques Carette
2008-07-11 23:11 ` Zheng Li
2008-07-13 14:32 ` [Caml-list] " Dario Teixeira
2008-07-13 17:39 ` Dario Teixeira
2008-07-13 21:10 ` Jon Harrop
2008-07-14 15:11 ` Dario Teixeira
2008-07-14 18:52 ` Dario Teixeira
2008-07-14 19:37 ` Jeremy Yallop [this message]
2008-07-16 21:22 ` Dario Teixeira
2008-07-17 0:43 ` Jacques Garrigue
2008-07-17 10:59 ` Jeremy Yallop
2008-07-18 2:34 ` Jacques Garrigue
2008-07-18 9:47 ` Jeremy Yallop
2008-07-18 13:02 ` Jacques Garrigue
2008-07-18 13:55 ` Jacques Garrigue
2008-07-19 2:15 ` Jacques Garrigue
2008-07-17 16:12 ` Dario Teixeira
2008-07-18 2:27 ` Jacques Garrigue
2008-07-18 13:09 ` Dario Teixeira
2008-07-18 17:36 ` Dario Teixeira
2008-07-19 2:23 ` Jacques Garrigue
2008-07-19 8:43 ` Dario Teixeira
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=487BAB0B.6030000@ed.ac.uk \
--to=jeremy.yallop@ed.ac.uk \
--cc=caml-list@yquem.inria.fr \
--cc=darioteixeira@yahoo.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