I think it is pretty clear we will use simple type inference for if expressions.  <br><div class="gmail_quote"><div dir="ltr">On Wed, Jul 27, 2016 at 7:17 PM James Noble <<a href="mailto:kjx@ecs.vuw.ac.nz">kjx@ecs.vuw.ac.nz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
> On 28/07/2016, at 5:02AM, Andrew P. Black <<a href="mailto:black@cs.pdx.edu" target="_blank">black@cs.pdx.edu</a>> wrote:<br>
><br>
> The object generated by the above code has dynamic type<br>
><br>
>       interface {<br>
>               x -> Boolean<br>
>       }<br>
<br>
No, it has type<br>
<br>
>       interface {<br>
>               x -> Unknown<br>
>       }<br>
<br>
because the declaration of "if" has no declared return type.<br>
more simply, given the definition<br>
<br>
method min(a, b) {<br>
    if (a < b) then { a } else { b }<br>
}<br>
<br>
then any def (or indeed anything) that gets the value of min will have the Unknown (dynamic) type.  We could do a bit better by writing:<br>
<br>
method min[[T]](a : T, b : T) -> T {<br>
    if (a < b) then { a } else { b }<br>
}<br>
<br>
but if we call it as "min(1,2)" the resulting type is again Unknown.<br>
To get a return type of Number we'd have to write "min[[Number]](1,2)"<br>
We can statically infer that x should have type "Number", say,<br>
but at that point type inference is changing the behaviour of the program:<br>
the type inference algorithm is changing the dynamic types of objects in the program.<br>
<br>
James<br>
<br>
</blockquote></div>