From: Andreas Rossberg <rossberg@mpi-sws.org>
To: "François Pottier" <francois.pottier@inria.fr>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] coinductive data types
Date: Tue, 30 Aug 2022 18:45:30 +0200 [thread overview]
Message-ID: <2C890C66-F8F7-402C-B88E-587C3E21DE89@mpi-sws.org> (raw)
In-Reply-To: <8078ad33-f220-b233-4863-06ce30cc8cff@inria.fr>
Hi François,
I’m curious why you would categorise iso-recursive types as nominal. I have always considered them structural as well, since two structurally matching iso-recursive type expressions are still deemed equivalent. That matters in so far as it makes them modular in a way that true nominal types are not.
Iso-recursive types would only behave like nominal in the degenerate case where all type definitions occurring in the entire program (across module boundaries) are tied into a single grand iso-recursive knot, I think.
/Andreas
> On 30. 8. 2022, at 17:47, François Pottier <Francois.Pottier@inria.fr> wrote:
>
>
> Hi,
>
> On 30/08/2022 14:37, Aaron Gray wrote:
> > My original path of inquiry which I should have actually stated was
> > regarding how to go about implementing subtyping of mutually recursive
> > algebraic data types.
>
> Do you mean implementing an algorithm that decides whether two types are
> related by subtyping, in the presence of mutually recursive algebraic
> data types?
>
> I guess the answer depends on exactly how the subtying relation is defined.
> E.g., if "α foo" and "β bar" are (parameterized) algebraic data types, does
> the subtyping relation "α foo ≤ β bar" necessarily imply that "foo" and "bar"
> are the same algebraic data type?
>
> - If the answer is positive, then the problem boils down to deciding
> "α ≤ β" or "β ≤ α" or neither or both, depending on whether this
> algebraic data type is covariant or contravariant or neither or both.
> In that case, you are working with "isorecursive" types,
> also known as "nominal" types.
>
> - If the answer is negative, then (I imagine) you wish to unfold the
> definitions of "foo" and "bar" and decide whether the two unfoldings
> are related by subtyping.
> In that case, you are working with "equirecursive" types,
> also known as "structural" types.
>
> Brandt and Henglein ("Coinductive axiomatization of recursive type equality
> and subtyping", 1998) study the second problem, if I remember correctly.
>
> > Does OCaML use/handle subtyping of mutually recursive algebraic data
> > types ? And if so, is its implementation easily accessible ?
>
> OCaml has explicit subtyping coercions: a user can write `(e : t1 :> t2)`
> and the compiler will check that `t1` is a subtype of `t2`.
>
> As far as algebraic data types are concerned, OCaml's notion of subtyping is
> nominal, I believe. An algebraic data type can be decorated with variance
> annotations, so, for instance, "list" can be declared covariant and "α list"
> is considered a subtype of "β list" if α is a subtype of β. However, "α list"
> can never be considered a subtype of an algebraic data type other than "list".
>
> The variance annotations provided by the programmer are checked when an
> algebraic data type is defined, and are later used when deciding whether a
> subtyping relation holds.
>
> Some more information here:
>
> https://blog.janestreet.com/a-and-a/
> https://v2.ocaml.org/manual/expr.html#ss%3Aexpr-coercions
>
> --
> François Pottier
> Francois.Pottier@inria.fr
> http://cambium.inria.fr/~fpottier/
next prev parent reply other threads:[~2022-08-30 16:45 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-29 15:43 Aaron Gray
2022-08-30 7:24 ` François Pottier
2022-08-30 11:11 ` Xavier Leroy
2022-08-30 12:33 ` Aaron Gray
2022-08-31 1:21 ` Jacques Garrigue
[not found] ` <11E3A59A-BD33-4EC0-9FAD-711A1EACA35E@gmail.com>
2022-08-31 3:22 ` Aaron Gray
2022-09-01 12:13 ` Jacques Garrigue
2022-08-30 12:37 ` Aaron Gray
2022-08-30 13:57 ` Nate Foster
2022-08-30 15:27 ` Aaron Gray
2022-08-30 15:47 ` François Pottier
2022-08-30 16:32 ` Aaron Gray
2022-08-31 8:19 ` François Pottier
2022-08-30 16:45 ` Andreas Rossberg [this message]
2022-08-30 17:01 ` Aaron Gray
2022-08-30 18:20 ` Nate Foster
2022-08-31 8:25 ` François Pottier
2022-08-31 8:46 ` Peter Thiemann
2022-08-31 9:41 ` Andreas Rossberg
2022-08-31 13:49 ` François Pottier
2022-08-31 15:40 ` Peter Thiemann
2022-08-31 16:44 ` Andreas Rossberg
2022-08-31 15:55 ` Basile Clement
2022-08-31 18:42 ` Andreas Rossberg
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=2C890C66-F8F7-402C-B88E-587C3E21DE89@mpi-sws.org \
--to=rossberg@mpi-sws.org \
--cc=caml-list@inria.fr \
--cc=francois.pottier@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