<div dir="ltr"><div><div><div><div>The type of curry is correct, but imprecise.  It does not express all possible uses of curry.  The curry function can be used to split any function application into an arbitrary number of stages, each with an arbitrary number of arguments.  There is no way to write down that type.  Typed Racket needs to know how many stages there are to the function application -- that&#39;s the nesting level of &quot;-&gt;&quot; -- and how many arguments all but the last step take -- because there can be only one &quot;...&quot; in the initial function type, and it must be at the end of the arguments.<br>

<br>Right now the type is specialized to two stages, each with one argument.  It could be generalized a bit further -- perhaps to allow arbitrary arguments at the second stage, or to allow two arguments at the first stage, or to allow a three-stage case as well, or some combination thereof.  However, this specialization can only go to some arbitrary, finite degree without changing the type system, and each addition will complicate the type of curry used in error messages.<br>

<br></div><div>For now, that means you will have to define f1a explicitly, or write a more specific instantiation of curry for your uses.  In the future, perhaps the TR implementers can broaden the type of curry a bit.  Types for this kind of higher-order function are an area of open research for TR, so perhaps things will get better in the future.<br>

</div></div></div></div></div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Sun, Feb 24, 2013 at 5:59 PM, Norman Gray <span dir="ltr">&lt;<a href="mailto:norman@astro.gla.ac.uk" target="_blank">norman@astro.gla.ac.uk</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Greetings,<br>
<br>
Is the type of &#39;curry&#39; correct?<br>
<br>
#lang typed/racket<br>
<br>
(: f2 (Boolean Integer Integer -&gt; Integer))<br>
(define (f2 add? i1 i2)<br>
  (if add?<br>
      (+ i1 i2)<br>
      (- i1 i2)))<br>
<br>
(define f1a (curry f2 #t)) ; fails to typecheck<br>
<br>
(f2 #t 2 3)<br>
(f2 #f 2 1)<br>
;(f1a 10 20)<br>
<br>
===&gt;<br>
<br>
Welcome to DrRacket, version 5.3.3 [3m].<br>
Language: typed/racket; memory limit: 128 MB.<br>
. Type Checker: Polymorphic function curry could not be applied to arguments:<br>
Domains: (a b -&gt; c)<br>
         (a b -&gt; c) a<br>
Arguments: (Boolean Integer Integer -&gt; Integer) True<br>
 in: (curry f2 #t)<br>
&gt;<br>
<br>
It works fine when currying a two-argument function.<br>
<br>
All the best,<br>
<br>
Norman<br>
(I&#39;ll resist any vindaloo jokes)<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
Norman Gray  :  <a href="http://nxg.me.uk" target="_blank">http://nxg.me.uk</a><br>
SUPA School of Physics and Astronomy, University of Glasgow, UK<br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</font></span></blockquote></div><br></div>