caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>
To: rixed@happyleptic.org
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] typer strangeness (3.12.0)
Date: Sun, 14 Aug 2011 18:46:50 +0900	[thread overview]
Message-ID: <BEFA87A9-C4D3-4235-B7A6-D4F8CBE2E0B1@math.nagoya-u.ac.jp> (raw)
In-Reply-To: <20110806125021.GB10154@ombreroze.happyleptic.org>

On 2011/08/06, at 21:50, rixed@happyleptic.org wrote:

> Given these types:
> 
> (* A parser is given a list of items and returns either a Failure indication, a
>   Wait for more inputs indication, or a result (composed of a new value and the list
>   of tokens that were unused) *)
> type ('a, 'b) parzer_result = Wait | Res of ('a * 'b list) | Fail
> type ('a, 'b) parzer = 'b list -> ('a, 'b) parzer_result
> 
> And this function used to pipe two parsers together:
> 
> (* Use the results of the first parser as the input elements of the second.
>   Stop as soon as p2 returns a result or fails.
>   Notice that if p1 is a ('a, 'b) parzer and p2 a ('c, 'a) parzer
>   then pipe p1 p2 is a ('c, 'b) parzer, which comes handy but p2 is then
>   forced to consume everything ! *)
> let (pipe : ('a, 'b) parzer -> ('c, 'a) parzer -> ('c, 'b) parzer) p1 p2 =
>    let p1_rem = ref [] in
>    fun bs -> match p1 (!p1_rem @ bs) with
>        | Fail -> Fail
>        | Wait -> Wait
>        | Res (res, rem) ->
>            p1_rem := rem ;
>            (match p2 [res] with
>                | Res (res', rem') ->
>                    if rem' <> [] then Printf.printf "WRN: second end of a pipe did not consume eveything !\n" ;
>                    Res (res', !p1_rem)
>                | Fail -> Fail | Wait -> Wait)
> 
> This pipe function has the expected type :
> 
> # pipe;;
> - : ('a, 'b) parzer -> ('c, 'a) parzer -> ('c, 'b) parzer = <fun>
> 
> Now, if I change it's last line for : "| x -> x)", ie not repeating Wait and Fail, the result is
> very different :
> 
> # pipe;;
> - : ('a, 'a) parzer -> ('b, 'a) parzer -> ('b, 'a) parzer = <fun>
> 
> How come?

If you write "x -> x", the output of p1 is forced to be the same type as the output of the function,
which forces the unification of 'a and 'b. Note that this second type is equivalent to
> - : ('a, 'a) parzer -> ('c, 'a) parzer -> ('c, 'a) parzer = <fun>

If you explicitly write "Fail -> Fail | Wait -> Wait", no such unification happens, and you get
the intended type.
You can get the same behaviour by writing "Fail | Wait as x -> x", i.e. the type checker is clever
enough to not unify the pattern type and the variable type.

> And why didn't the compiler complain since I explicitely typed the function definition?


You already got your answer. A simple type annotation does not enforce polymorphism.

Hope this helps,

	Jacques

      parent reply	other threads:[~2011-08-14  9:47 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-06 12:50 rixed
2011-08-06 12:58 ` Fabrice Le Fessant
2011-08-06 17:03   ` Guillaume Yziquel
2011-08-14  6:19   ` rixed
2011-08-14  7:08     ` Guillaume Yziquel
2011-08-14  7:59       ` rixed
2011-08-14  9:46 ` Jacques Garrigue [this message]

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=BEFA87A9-C4D3-4235-B7A6-D4F8CBE2E0B1@math.nagoya-u.ac.jp \
    --to=garrigue@math.nagoya-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=rixed@happyleptic.org \
    /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).