Hi Ross, That's a good point. Do you mind filing a JIRA issue for this?
Slava > On Jul 8, 2016, at 11:56 AM, Ross LeBeau <ross.leb...@gmail.com> wrote: > > Hi Slava, > > Thanks for the insight. This is what I suspected, but I wasn't sure about how > set the team was on this concept. Currently, it seems that if the types > cannot be inferred, the type checker picks an implementation and checks > against that. > > E.g., the following code works because it conforms to the signature of the > flatMap that the type checker decided to use: > > b = a.flatMap { elem in > print(elem) > return 1 > } > > Given that adding multi-statement type inference is off the table, perhaps > you could consider adding a helpful message when this situation arises? Like > if type inference of a closure fails, and the closure doesn't type check with > the assumed context, maybe tell the user "Did not infer types, try explicitly > declaring them"? > > Just trying to think of a way to guide a less advanced user, since this error > could arise from many functions and also from genuine errors, so it may be > hard to google/ask for help with. > > -- > Ross LeBeau > > On July 8, 2016 at 2:31:46 PM, Slava Pestov (spes...@apple.com > <mailto:spes...@apple.com>) wrote: > >> Hi Ross, >> >> Swift's type inference operates at the level of a single statement. This is >> why we can infer parameter and return types for single-expression closures. >> While conceptually, it would not be a huge change to the type checker >> algorithm to support global type inference for closures and other functions >> consisting of multiple statements, we feel that philosophically, this is not >> a direction the language should take. Global type inference will further >> exacerbate performance problems with type checking, as well as make it >> harder to produce good diagnostics. >> >> So really, this has less to do with closures per se, and more with just the >> general design and philosophy of the type checker. >> >> (Please correct me if I've mis-represented anything here -- this is my >> recollection of listening in on various discussions in the past). >> >> > On Jul 8, 2016, at 10:00 AM, Ross LeBeau via swift-dev >> > <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote: >> > >> > 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: >> > >> > let a = [[1,2],[3],[4,5,6]] >> > var b: [Int] >> > b = a.flatMap { elem in >> > return elem >> > } >> > >> > But this fails with an error "cannot convert return expression of type >> > '[Int]' to return type 'Int?'": >> > >> > b = a.flatMap { elem in >> > print(elem) >> > return elem >> > } >> > >> > And, of course, if you explicitly type the function, it works again: >> > >> > b = a.flatMap { (elem: [Int]) -> [Int] in >> > print(elem) >> > return elem >> > } >> > >> > 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. >> > >> > 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's >> > going on. >> > >> > Also if this has already been brought up, forgive me, I just subscribed to >> > this list and a quick search of the archives didn't get any hits :) >> > >> > -- >> > Ross >> > _______________________________________________ >> > swift-dev mailing list >> > swift-dev@swift.org <mailto:swift-dev@swift.org> >> > https://lists.swift.org/mailman/listinfo/swift-dev >> > <https://lists.swift.org/mailman/listinfo/swift-dev>
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev