<div dir="ltr"><div><div>Calling `exprType` on:</div><div><br></div><div>case enumFromStepN</div><div>       Int</div><div>       $fNumInt</div><div>       (I# 1)</div><div>       (I# 1)</div><div>       x of wild</div><div>
  Stream s1 ostep t ds1 -&gt; Left s1 ((Int, (Int, Int)), s1) t</div><div><br></div><div>gives:</div><div><br></div><div>Either s1 ((Int, (Int, Int)), s1)</div><div><br></div><div>Which is problematic, as the type variable &#39;s1&#39; is unbound outside of the alternative RHS!</div>
<div><br></div><div>Unfolding the scrutinee and case-reducing gives:</div><div><br></div><div>Left (Int, Int) ((Int, (Int, Int)), (Int, Int))</div><div>  ((,)</div><div>     Int</div><div>     Int</div><div>     (I# 1)</div>
<div>     (case x of n1</div><div>        I# ipv ? n1))</div><div><br></div><div>Calling `exprType` now gives:</div><div><br></div><div>Either (Int, Int) ((Int, (Int, Int)), (Int, Int))</div><div><br></div><div>That is, `s1` was `(Int, Int)` in this case.</div>
<div><br></div><div>Is it expected that `exprType` behaves this way? Or should I file a ticket?</div></div><div><br></div><div style>I realize the type of the scrutinee (in this case Stream Int) gives no indication as to the existential type... and I&#39;m not sure how you would get it without making exprType do some kind of evaluation, but it would be nice if exprType at least failed if it doesn&#39;t have enough information...</div>
<div style><br></div><div style>Andrew</div></div>