<div dir="ltr"><div><div><div>You can sort of fake it if you wrap your function in a structure type.  In lieu of <br><br></div>(define-type T1 (Symbol -&gt; String))<br><br></div>Instead use a struct:.<br><div><br>(struct: T1 ([f : (Symbol -&gt; String)]))<br>
  <br></div><div>;; predicate is T1? for a wrapped Symbol-&gt;String function<br></div><div><br>(define-type T2 (U Symbol Number T1)) ;; T1 is a boxed function of Symbol-&gt;String<br><br>(: yup (T2 -&gt; String))<br>(define (yup t2)<br>
  (cond<br>    ((symbol? t2) (symbol-&gt;string t2))<br>    ((number? t2) (number-&gt;string t2))<br>    (else (match t2<br>            ((T1 f) (f &#39;goodbye))))))<br><br>(yup &#39;hello)<br>(yup 123)<br>(yup (T1 symbol-&gt;string))<br>
<br></div>And
 I don&#39;t know but maybe it would be possible for a sufficiently smart 
compiler to elide the T1 boxing and unboxing of the wrapped function.<br></div>Well for that matter eliding any single wrapped value type.<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 21, 2013 at 9:54 AM, Matthias Felleisen <span dir="ltr">&lt;<a href="mailto:matthias@ccs.neu.edu" target="_blank">matthias@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
(And this is not a limitation of Typed Racket but a fundamental problem of CS.)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On May 20, 2013, at 11:07 AM, Eric Dobson &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt; wrote:<br>
<br>
&gt; No, you cannot define predicates for function types. If you explain<br>
&gt; the problem you have, we might be able to explain another solution<br>
&gt; that will work.<br>
&gt;<br>
&gt; On Mon, May 20, 2013 at 1:32 AM, Paul Leger &lt;<a href="mailto:pleger@gmail.com">pleger@gmail.com</a>&gt; wrote:<br>
&gt;&gt; Hi all,<br>
&gt;&gt;      Maybe, this question is very easy. In the following code, I try<br>
&gt;&gt; defining a predicate for T2, but I cannot because T1 it is a function.<br>
&gt;&gt;<br>
&gt;&gt; (define-type T1 (Symbol -&gt; Any) )<br>
&gt;&gt; (define-type T2 (U Symbol Number T1))<br>
&gt;&gt;<br>
&gt;&gt; ;(define-predicate T1? Procedure) ;this line is useless<br>
&gt;&gt;<br>
&gt;&gt; (define-predicate T2? T2)<br>
&gt;&gt;<br>
&gt;&gt;&gt; Type Checker: Type T2 could not be converted to a contract. in: T2<br>
&gt;&gt;<br>
&gt;&gt; My unsuccessful answer is:<br>
&gt;&gt;  (define-type T2 (U Symbol Number Procedure))<br>
&gt;&gt;<br>
&gt;&gt; I do not like it because I lose the relationship between T1 and T2. Are<br>
&gt;&gt; there some possibility<br>
&gt;&gt;<br>
&gt;&gt; Thank in advance,<br>
&gt;&gt; Paul<br>
&gt;&gt;<br>
&gt;&gt; ____________________<br>
&gt;&gt;  Racket Users list:<br>
&gt;&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;&gt;<br>
&gt; ____________________<br>
&gt;  Racket Users list:<br>
&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<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>
</div></div></blockquote></div><br></div>