caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Alexey Egorov <alex.only.d@gmail.com>
To: Gabriel Scherer <gabriel.scherer@gmail.com>
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] strange type error with -principal
Date: Fri, 18 Aug 2017 20:23:57 +0500	[thread overview]
Message-ID: <CAJannG4LZeuH3UVuTTFvO5pnx5XcF6iHQGoNoMH-08P+1tprag@mail.gmail.com> (raw)
In-Reply-To: <CAPFanBFerr62Uv43q9ewRsDKT+geHZXnN+8cHuFZk=pBsrF5sw@mail.gmail.com>

Thanks for explanation!
Every problem I've had with GADTs was solved placing an annotation in
the right place...

2017-08-18 19:36 GMT+05:00 Gabriel Scherer <gabriel.scherer@gmail.com>:
> These errors on "ambiguous" types come from GADT type checking, which
> requires annotations in certain places (-principal is more picky about
> requiring more annotations; instead sometimes the type-checker makes
> guesses).
>
> Currently the syntactic forms
>   let <variable> : <type> = <expr> in <expr>
> and
>   let <pattern> : <type> = <expr> in <expr>
> are not desugared in the same way. The first is turned into
>   let <variable> = (<expr> : <type>) in <expr>
> and the second into
>   let (<pattern> : <type>) = <expr> in <expr>
>
> In the first case (let <variable>), the body of the definition gets the
> annotation. This is required, in your code, for this body to compile under
> -principal. In the second case (let <pattern>), the body does not get the
> annotation, so type-checking fails (under -principal).
>
> You can fix it yourself by adding the annotation on the right-hand-side
> directly
>
>   let (op, idx) = (begin match ... end : int op * int)
>
> in fact it suffices to write (op : int op), 2 in the second clause's
> right-hand-side.
>
> I don't know whether (let <pattern> : <type> = <expr> in <expr>) could
> instead be desugared into
> (let (<pattern> : <type) = (<expr> : <type>) in <expr>), which would also
> fix the issue. The specifics of how type information is propagated in the
> type-checker is a delicate design aspect of the type-checker which may still
> evolve in the future.
>
> If you wonder what the error message means, you should read the GADT section
> in the Reference Manual, and in particular the "type inference" subsection
> (but it depends on the text before it):
>   http://caml.inria.fr/pub/docs/manual-ocaml-4.05/extn.html#sec236
>
> The problem is that within the Op clause, we know the type equality (a =
> int), but this is not true outside the clause; so when a value that has both
> types (a op) and (int op) is returned by the clause, the type-checker cannot
> know which type to give to the outside (a op, or int op?), and it needs an
> explicit annotation to not make an arbitrary (non-principal) choice.
>
> On Fri, Aug 18, 2017 at 4:09 PM, Alexey Egorov <alex.only.d@gmail.com>
> wrote:
>>
>> Hello,
>>
>> I'm getting very confusing error when compiling with -principal:
>>
>> > Error: This expression has type int op
>> >       but an expression was expected of type 'a
>> >       This instance of int is ambiguous:
>> >       it would escape the scope of its equation
>>
>> What is the "instance of int"?
>>
>> Here is the code - https://pastebin.com/T74haahx
>> I'm mostly confused by the fact that changing pattern from (op, idx)
>> to simple value binding eliminates this error.
>>
>> Thanks!
>>
>> --
>> Caml-list mailing list.  Subscription management and archives:
>> https://sympa.inria.fr/sympa/arc/caml-list
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>
>

  reply	other threads:[~2017-08-18 15:24 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-18 14:09 Alexey Egorov
2017-08-18 14:36 ` Gabriel Scherer
2017-08-18 15:23   ` Alexey Egorov [this message]
2017-08-18 15:33     ` Gabriel Scherer

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=CAJannG4LZeuH3UVuTTFvO5pnx5XcF6iHQGoNoMH-08P+1tprag@mail.gmail.com \
    --to=alex.only.d@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=gabriel.scherer@gmail.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;
as well as URLs for NNTP newsgroup(s).