caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: "Mark Shinwell" <mshinwell@janestcapital.com>
To: Jeremy Yallop <jeremy.yallop@ed.ac.uk>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] surprising type error with labels
Date: Fri, 20 Jun 2008 08:53:36 -0400	[thread overview]
Message-ID: <20080620125336.GN30596@janestcapital.com> (raw)
In-Reply-To: <485AD6A3.7060606@ed.ac.uk>

On Thu, Jun 19, 2008 at 10:58:59PM +0100, Jeremy Yallop wrote:
> Jake Donham wrote:
> >Why does
> >
> > ListLabels.find (fun _ -> true) [];;
> >
> >produce
> >
> > Characters 16-31:
> >   ListLabels.find (fun _ -> true) [];;
> >                   ^^^^^^^^^^^^^^^
> > This expression should not be a function, the expected type is
> > ('a -> 'b) list
> >
> >I thought the rule was that "if an application is total, labels may be
> >omitted." (4.1 in the manual). (I was trying to do module List =
> >ListLabels at the top of a file.) Thanks,
> 
> Applications of functions whose return types are type variables are 
> never considered total, since it's possible to pass extra arguments if 
> the type variable is instantiated to a function type.  For example, 
> ListLabels.find has type
> 
>    f:('a -> bool) -> 'a list -> 'a
> 
> If the type variable is instantiated to `bool -> bool', say, then you 
> can pass more than two arguments:
> 
>    ListLabels.find ~f:(fun f -> f false) [not] false

I'm not really sure that this behaviour (which is highly non-obvious from
the error message) is to do with applying future unlabelled arguments.
As far as I can see it's probably this way so you can apply future
_labelled_ arguments, meaning you can write things like:

# ListLabels.find [] (fun x -> x);;
- : f:((('a -> 'a) -> 'b) -> bool) -> 'b = <fun>

and also:

# ListLabels.find ~f:(fun (f:(z:int -> int)) -> true) ~z:42 [fun ~z -> 1];;
- : int = 1

(note that the ~z:42 has been commuted with the list).  This seems kinda
cool, but the code is somewhat obfuscated, and error messages are potentially
confusing as Jake witnessed.

Is there any theoretical reason why the compiler couldn't just deem
applications of the form given by the original poster as total, even though
it results in the loss of some expressibility?  Perhaps it would be easier
to improve the error messages in that case... or perhaps it just results in
too little expressibility for some reason.

Mark


  reply	other threads:[~2008-06-20 12:53 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-19 21:38 Jake Donham
2008-06-19 21:58 ` [Caml-list] " Jeremy Yallop
2008-06-20 12:53   ` Mark Shinwell [this message]
2008-06-20 13:39     ` Jeremy Yallop

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=20080620125336.GN30596@janestcapital.com \
    --to=mshinwell@janestcapital.com \
    --cc=caml-list@inria.fr \
    --cc=jeremy.yallop@ed.ac.uk \
    /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).