From: Francois Pottier <francois.pottier@inria.fr>
To: caml-list@inria.fr
Subject: Re: [Caml-list] Extensible tuple types
Date: Thu, 2 May 2002 09:34:35 +0200 [thread overview]
Message-ID: <20020502093435.C27687@pauillac.inria.fr> (raw)
In-Reply-To: <6ECF4649-5C48-11D6-AC27-0003934491C2@lasmea.univ-bpclermont.fr>; from jserot@lasmea.univ-bpclermont.fr on Tue, Apr 30, 2002 at 04:42:01PM +0200
On Tue, Apr 30, 2002 at 04:42:01PM +0200, Jocelyn Sérot wrote:
>
> Sorry to jump in the middle of this discussion, but your last remark on
> "extensible
> n-tuples" drew my attention (i use to need this kind of thing in a
> completely different
> context). Can you provide references on these extensions of ML type
> systems ?
Tuples can be viewed as records whose field labels are integers, rather than
names. (In particular, this means that tuple fields do not commute, contrary
to record fields.) Records can be typed in a flexible way using rows; see
Didier Rémy's papers, for instance ``Type Inference for Records in a Natural
Extension of ML''. In the case of tuples, it's possible to use a variant of
rows -- I'll call them ``sequences'' -- to describe an infinite sequence of
types. Their syntax is given by
s ::= 's | t; s | all(t)
where t stands for a type. 's is a ``sequence variable''. t; s is a sequence
whose first component is t and whose other components are listed by s. all(t)
is the sequence where every component is t.
As in the case of records, we introduce type constructors Absent (0-ary) and
Present (unary) to tell which components are present/absent in a tuple. We
also introduce a ``tuple'' type constructor, whose argument is a sequence;
that is, (s) is the type of tuples whose contents is described by the sequence
s.
Then, you can give types to the basic operations on tuples, as follows.
The empty tuple has type (all(Absent)), for it has no components.
The operation which accepts any tuple, of length at least k, and returns
its k-th component, has type
forall 'a_1, ..., 'a_k, 's.
('a_1; ...; 'a_{k-1}; Present('a_k); 's) -> 'a_k
The operation which accepts any tuple and adds a new component in front
of it has type
forall 'a, 's.
'a -> ('s) -> (Present('a); 's)
Now, for the whole thing to work out in an extension of ML, you need to make
sure that unification of sequences is decidable. This seems straightforward;
the cases of interest are decomposition:
t1;s1 = t2; s2 reduces to t1 = t2 and s1 = s2
and expansion of uniform sequences:
all(t1) = t2; s2 reduces to t1 = t2 and all(t1) = s2
One slightly inelegant aspect of this approach is the fact that there
are empty types, such as (Absent;Present(int);all(Absent)). It's
impossible, given the operations above, to build a value of this
type. However, I can imagine situations where such types could
actually be of some use, e.g. if you add coercions of type
forall 'a_1, ..., 'a_k, 's.
('a_1; ...; 'a_{k-1}; 'a_k; 's) -> ('a_1; ...; 'a_{k-1}; Absent; 's)
then you gain the ability to forbid access to certain fields
within a tuple.
After writing this far, I realize that it's possible to simplify further
by considering *finite* sequences and replacing the form all(t) with a
simple ``nil'' sequence constructor, representing an empty sequence. Then,
you can suppress Absent and Present, and you no longer have ``tuples with
holes'' as above. My original presentation was biased because I started
from rows, which represent infinite collections.
These ``sequences'' haven't been widely used in the literature; the only
instance I know of is the use of finite sequences to describe the structure of
stacks in Morrisett et al's STAL (stack-based assembly language). In their
setting, the key point is the ability to universally quantify over sequence
variables, making all but a portion of the stack abstract.
I hope this helps,
--
François Pottier
Francois.Pottier@inria.fr
http://pauillac.inria.fr/~fpottier/
-------------------
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
next prev parent reply other threads:[~2002-05-02 7:34 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-04-23 10:41 [Caml-list] How to read three integers from a text-file... ? Jacek Chrzaszcz
2002-04-24 10:44 ` Stefano Lanzavecchia
2002-04-24 18:46 ` Tomasz Zielonka
2002-04-24 11:16 ` Jacques Garrigue
2002-04-24 13:40 ` Tomasz Zielonka
2002-04-25 5:30 ` pervasives (was: Re: [Caml-list] How to read three integers from a text-file... ?) Chris Hecker
2002-04-25 6:33 ` Tomasz Zielonka
2002-04-25 17:54 ` Chris Hecker
2002-04-27 4:43 ` John Max Skaller
2002-04-27 16:02 ` [Caml-list] input_line (Re: pervasives) Lauri Alanko
2002-04-30 12:07 ` [Caml-list] input_line Xavier Leroy
2002-05-03 0:13 ` Lauri Alanko
2002-05-03 11:27 ` Florian Hars
2002-04-24 21:23 ` [Caml-list] How to read three integers from a text-file... ? Tomasz Zielonka
2002-04-25 1:51 ` John Max Skaller
2002-04-25 8:55 ` Daniel de Rauglaudre
2002-04-25 11:19 ` Markus Mottl
2002-04-25 11:33 ` Jérôme Marant
2002-04-25 11:43 ` Markus Mottl
2002-04-25 17:56 ` Chris Hecker
2002-04-25 20:52 ` John Prevost
2002-04-25 23:32 ` Jacques Garrigue
2002-04-26 7:25 ` Jérôme Marant
2002-04-26 12:16 ` Jacques Garrigue
2002-05-02 8:48 ` Jacques Garrigue
2002-04-26 1:39 ` Daniel de Rauglaudre
2002-04-29 6:44 ` Francois Pottier
2002-04-30 11:07 ` Dave Berry
2002-04-30 12:20 ` Francois Pottier
2002-04-30 13:54 ` T. Kurt Bond
2002-05-03 22:12 ` Dave Berry
2002-04-30 14:42 ` Jocelyn Sérot
2002-05-02 7:34 ` Francois Pottier [this message]
2002-05-02 9:42 ` [Caml-list] Extensible tuple types Alain Frisch
2002-05-02 11:03 ` Francois Pottier
[not found] ` <6ECF4649-5C48-11D6-AC27-0003934491C2@lasmea.univ-bpclermon t.fr>
2002-05-03 21:58 ` [Caml-list] How to read three integers from a text-file... ? Dave Berry
2002-05-06 0:53 ` Eray Ozkural
2002-05-06 6:40 ` Florian Hars
2002-04-30 23:30 ` [Caml-list] Danvy "Functional Unparsing" style output in OCaml [was: How to read three integers from a text-file... ?] T. Kurt Bond
2002-05-13 14:11 ` [Caml-list] RE: Danvy "Functional Unparsing" style output in OCaml T. Kurt Bond
2002-05-13 19:59 ` [Caml-list] "Functional Unparsing" benchmark results links fixed [Was: Danvy "Functional Unparsing" style output in OCaml] T. Kurt Bond
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=20020502093435.C27687@pauillac.inria.fr \
--to=francois.pottier@inria.fr \
--cc=caml-list@inria.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