caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Philippe Veber <philippe.veber@gmail.com>
To: Abdallah Saffidine <abdallah.saffidine@gmail.com>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] How to use GADTs across modules in OCaml without raising warnings?
Date: Tue, 13 Oct 2015 08:09:37 +0200	[thread overview]
Message-ID: <CAOOOohSiFxCb59ZfifNDofZXF55kxFAqtf0AtoWfJh=ApqrwYQ@mail.gmail.com> (raw)
In-Reply-To: <CALx9x4dgS_1_SFGu3Qn77UH8dw957A-s2h44Gri4UbRRBRQ6FQ@mail.gmail.com>

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

Hi Abdallah,

  I came across the very same observation a few days ago. I'm not an expert
on typing but here's how I understand it: in gadt1.ml the declaration of
never makes it clear it is an empty type, which in particular is different
from bool. Now the signature of Gadt1 as seen by Gadt2 is:

module Gadt1 : sig
  type never
  type _ t1 = A1 : never t1 | B1 : bool t1
  [...]
end

This implies that Gadt2 doesn't see Gadt1.never as an empty type, but
rather as an abstract type, and so has no indication that it is different
from bool. The signature could as well be hiding a definition like type
never = bool. So in Gadt2, the exhaustiveness checker has no way to do its
job, hence the puzzling behavior you observe.

In my case I changed the definition of my phantom types from empty to
polymorphic variant types and made them explicit in the signature of the
module.

module Gadt1 : sig
  type never = [`never]
  [...]
end

I hope this intuitive explanation is not too far from the truth :o)!

Cheers,
  Philippe.


2015-10-13 7:27 GMT+02:00 Abdallah Saffidine <abdallah.saffidine@gmail.com>:

> Hi all,
>
> I am reposting this SO question
> <http://stackoverflow.com/questions/33093807/how-to-use-gadts-across-modules-in-ocaml-without-raising-warnings>.
> I suspect there might be a bug in the implementation of Warning 8.
>
> Thanks,
> Abdallah
>
> I have two files: gadt1.ml and gadt2.ml and the second depends on the
> first.
>
> gadt1.ml:
>
> type nevertype _ t1 = A1 : never  t1 | B1 : bool t1type _ t2 = A2 : string t2 | B2 : bool t2let get1 : bool t1 -> bool = function B1 -> truelet get2 : bool t2 -> bool = function B2 -> true
>
> gadt2.ml:
>
> let get1 : bool Gadt1.t1 -> bool = function Gadt.B1 -> truelet get2 : bool Gadt1.t2 -> bool = function Gadt.B2 -> true
>
> when I compile using ocaml 4.02.3 (ocamlbuild gadt2.native), I get a
> warning 8 about the function Gadt2.get1 not being exhaustive. I am quite
> puzzled that Gadt2.get1 raises a warning while Gadt1.get1 and Gadt2.get2
> don't.
>
> My assumption was that the empty type never cannot be equal to bool so
> Gadt2.get1 should not raise a warning. On the other hand, if I call
> Gadt2.get1 with argument A1, I get a type error (as desired). Is the
> warning expected behaviour or a bug? What did I miss?
>
>

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

  parent reply	other threads:[~2015-10-13  6:09 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-13  5:27 Abdallah Saffidine
2015-10-13  6:06 ` Stefan Holdermans
2015-10-13  6:09 ` Philippe Veber [this message]
2015-10-13  6:15   ` Ben Millwood
2015-10-13  9:45     ` Jeremy Yallop
2015-10-14  2:13       ` Abdallah Saffidine
2015-10-13  6:10 ` 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='CAOOOohSiFxCb59ZfifNDofZXF55kxFAqtf0AtoWfJh=ApqrwYQ@mail.gmail.com' \
    --to=philippe.veber@gmail.com \
    --cc=abdallah.saffidine@gmail.com \
    --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;
as well as URLs for NNTP newsgroup(s).