caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Philippe Veber <philippe.veber@googlemail.com>
To: Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Closed variants, type constraints and module  signature
Date: Mon, 17 May 2010 13:56:34 +0200	[thread overview]
Message-ID: <AANLkTikYr_BuPhpszSmWQZIB7tqcf3Cck9HbYGumvdux@mail.gmail.com> (raw)
In-Reply-To: <20100515.095445.134122748.garrigue@math.nagoya-u.ac.jp>

[-- Attachment #1: Type: text/plain, Size: 3536 bytes --]

2010/5/15 Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>

> From: Philippe Veber <philippe.veber@googlemail.com>
> > 2010/5/14 Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>
> >
> >> From: Philippe Veber <philippe.veber@googlemail.com>
> >>
> >> > I'd like to define a type with a variable that is constrained to
> accept
> >> only
> >> > polymorphic variant types included in a given set of tags. That is how
> I
> >> > believed one should do :
> ...
> >> > Does anyone know why the definition of module I is rejected ? And if
> this
> >> is
> >> > the intended behavior, why does the following work ?
> >> >
> >> > # let v : 'a t = `a
> >> >   ;;
> >> > val v : [< `a | `b > `a ] t = `a
> >>
> >> But it doesn't really work!
> >> More precisely, the type [< `a | `b > `a ] t is an instance of 'a t,
> >> not 'a t itself, an a module interface should give a type at most as
> >> general as the implementation.
> >>
> >
> > Right, I understand now there are two different mechanisms at hand here :
> in
> > the module case, the type annotation for v is a specification, in the let
> > binding case, it is a constraint. Seems like my question was better
> suited
> > to beginners list ! Just to be sure : module I is rejected because v
> should
> > have type 'a t for all 'a satisfying the constraint 'a = [< `a | `b ],
> that
> > contain in particular [ `b ], which is incompatible with the type of v.
> Is
> > that correct ?
>
> Yes, this is exactly the point I was trying to make. But it was a good
> idea to post it here: this is a rather technical point, I don't read
> the beginner-list usually, and your explanation is probably better
> than mine.
>
> >> In your case, you should simply write
> >>
> >>  type t = [`a | `b]
> >>
> >> since you don't know what v may be.
> >>
> >
> > If i absolutely wanted to forbid other tags than `a and `b, while keeping
> > the possibility to manage subtype hierarchies, maybe I could also change
> the
> > code this way :
> >
> > type u = [`a | `b]
> > type 'a t = 'a constraint 'a = [< u ]
> >
> > module type S = sig
> >   val v : u t
> >   val f : 'a t -> [`a] t
> > end
> >
> > module I : S = struct
> >   let v = `a
> >   let f _ = v
> > end
> >
> > At least now the interpreter doesn't complain. Many thanks !
>
> This indeed works, but I'm not sure of why you insist on defining a
> constrained type. What is wrong with writing directly the following?
>
> module type S = sig
>  val v : u
>   val f : [< u] -> [`a]
> end
>
Well, nothing ! I'm affraid I chose an inappropriate solution to an
irrelevant problem. Initially i just wanted to be sure my polymorphic type
'a t would not be used with funny tags in 'a (I mean tags that have nothing
to do with t). But after all, there is (in my case) no rationale for this.
Second, types may be shorter to write :

val f : 'a t -> int

instead of

val f : [< u] t -> int

or

val f : [< My_type.u ] My_type.t -> int

if in another module. Well, now it's clearer for me it was not such a smart
idea. Your proposal is simpler and more natural.



> Constrained types have their uses,

which are, in brief ? Now I can't see a typical use for closed polymorphic
variant types (I mean types of the form 'a t constraint 'a = [< ... ])

but I find them often confusing as
> the type variable you write is not really a type variable.
>
why isn't it the case ? Aren't they simply type variables restricted to a
finite number of types ?

Anyway, thanks a lot for commenting on my problem !

Philippe.






> Question of taste.
>
> Jacques Garrigue
>

[-- Attachment #2: Type: text/html, Size: 5272 bytes --]

  reply	other threads:[~2010-05-17 11:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-14 15:17 Philippe Veber
2010-05-14 15:49 ` [Caml-list] " Jacques Garrigue
2010-05-14 21:33   ` Philippe Veber
2010-05-15  0:54     ` Jacques Garrigue
2010-05-17 11:56       ` Philippe Veber [this message]
2010-05-17 14:31         ` Jacques Garrigue

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=AANLkTikYr_BuPhpszSmWQZIB7tqcf3Cck9HbYGumvdux@mail.gmail.com \
    --to=philippe.veber@googlemail.com \
    --cc=caml-list@inria.fr \
    --cc=garrigue@math.nagoya-u.ac.jp \
    /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;
as well as URLs for NNTP newsgroup(s).