> On May 18, 2016, at 12:51 PM, Joe Groff <[email protected]> wrote:
> 
>>> I thought about this, but { $0 } is already a fairly compact way to express 
>>> the identity function.
>> 
>> It is, but I worry a bit about the core team's tendency to say "Oh, just use 
>> a closure" whenever something like this comes up. A function/method/property 
>> name can be merely *read*; a closure must be *interpreted*. And writing 
>> closures is error-prone—a slip of the keys and you've written `{ 0 }` or `{ 
>> 40 }` instead of `{ $0 }`, which look similar and (soon will) work in the 
>> same expressions but behave completely differently.
> 
> It seems to me that you could just as easily fat-finger `self` when you meant 
> `.self`.

If I write `list.map { 0 }` instead of `list.map { $0 }`, that's perfectly 
valid code. If I write `list.map(self)` instead of `list.map(.self)`, 

> The type system is likely to catch both `{ 0 }` and `self` mistakes.

The type system will immediately (absent some odd overloading) catch `self` 
instead of `.self` because you're using an instance where a function is 
expected. But `{ 0 }` is a function `T -> Int` where `T -> T` is expected—a 
much more subtle difference, particularly since a closure's return value is 
often generic and used to determine the return value of the function it's 
passed to. So it's pretty likely that `{ 0 }` will satisfy the requirements of 
the immediate context; if type-checking is going to fail, it'll be because some 
later use of the result expects a `T` instead of an `Int`. So the type-checking 
failure will come in a future expression or statement, if indeed it ever does 
come at all.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to