<p dir="ltr">Its even simpler than that because the cases in case-&gt; are ordered. There are some intricacies when the first order checks of non flat contracts overlap, but with non overlapping first order checks for  higher order contracts or only flat contracts it should be doable. I don&#39;t have a lot of time for TR hacking currently, but if a bug is filed I may get to it at some point.</p>

<div class="gmail_quote">On Nov 17, 2012 11:33 AM, &quot;Robby Findler&quot; &lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This has come up enough times that maybe TR should convert contracts<br>
of the form:<br>
<br>
 (case-&gt;  (-&gt; &lt;flat&gt; ...) (-&gt; &lt;flat&gt; ...))<br>
<br>
into a dependent contract that checks the two &#39;flat&#39; things? (I guess<br>
you&#39;d have to have an ordering on types in case they overlap, but I<br>
presume you have this already.)<br>
<br>
On Sat, Nov 17, 2012 at 1:18 PM, Jens Axel Søgaard<br>
&lt;<a href="mailto:jensaxel@soegaard.net">jensaxel@soegaard.net</a>&gt; wrote:<br>
&gt; I have the following contract on next-prime :<br>
&gt;<br>
&gt;     (: next-prime : (case-&gt; (N -&gt; N) (Z -&gt; Z)) )<br>
&gt;<br>
&gt; It says that for all primes p, positive or negative, (next-prime p)<br>
&gt; will be an integer.<br>
&gt; Furthermore if p is a natural number, then (next-prime p) will also be<br>
&gt; a natural number.<br>
&gt;<br>
&gt; This type can&#39;t be converted to a contract:<br>
&gt;    Type Checker: The type of next-prime cannot be converted to a<br>
&gt; contract in: (next-prime 4)<br>
&gt;<br>
&gt; My understanding is that a since N is a subset of Z a predicate can&#39;t<br>
&gt; determine whether<br>
&gt; which case to use. Is there an alternative construct, that I can use<br>
&gt; in order to get<br>
&gt; a contract?<br>
&gt;<br>
&gt; My temporary solution is to provide untyped-next-prime<br>
&gt;<br>
&gt;    (: untyped-next-prime : Z -&gt; Z)<br>
&gt;    (define (untyped-next-prime z)<br>
&gt;      (next-prime z))<br>
&gt;<br>
&gt; whose type can be converted to a contract.<br>
&gt;<br>
&gt;<br>
&gt; See details in:<br>
&gt; <a href="https://github.com/plt/racket/blob/master/collects/math/private/number-theory/number-theory.rkt" target="_blank">https://github.com/plt/racket/blob/master/collects/math/private/number-theory/number-theory.rkt</a><br>

&gt;<br>
&gt; --<br>
&gt; Jens Axel Søgaard<br>
&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>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div>