<div dir="ltr">It seems that the compiler fails to infer the type of an anonymous function if the function contains more than one statement. For example, this works:<div><br></div><div><div>let a = [[1,2],[3],[4,5,6]]</div><div>var b: [Int]</div><div><div>b = a.flatMap { elem in</div><div>  return elem</div><div>}</div></div><div><br></div><div>But this fails with an error &quot;cannot convert return expression of type &#39;[Int]&#39; to return type &#39;Int?&#39;&quot;:</div><div><br></div><div><div>b = a.flatMap { elem in</div><div>  print(elem)</div><div>  return elem</div><div>}</div></div><div><br></div><div>And, of course, if you explicitly type the function, it works again:</div><div><br></div><div><div>b = a.flatMap { (elem: [Int]) -&gt; [Int] in</div><div>  print(elem)</div><div>  return elem</div><div>}</div></div><div><br></div><div>Greg Titus informed me that this is due to a heuristic in the compiler where it only imports the outer context when type-checking anonymous functions with a single statement. Before we knew this, I and others, found it perplexing that out of two functions that return the same value, one will compile and the other will not.</div><div><br></div><div>Are there any plans to extend the context of type-checking in the case of a failure like this? If not, is it something to consider? It seems like a difficult problem to solve without rather advanced knowledge of what&#39;s going on.</div><div><br></div><div>Also if this has already been brought up, forgive me, I just subscribed to this list and a quick search of the archives didn&#39;t get any hits :)</div>







<div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Ross</div></div>
</div></div>