Kevin,

I really like your reasoning about avoiding the code churn, and finding a 
better way to flag something to avoid optional hoisting. I think its better 
solution to the problem. It also has the added benefit of kicking out to map() 
and getting a slightly optimised version of the same method - free speed win 
for devs who unknowingly used `flatMap` not realizing `map()` is the preferred 
solution.

I’m not sure the potential for confusion is enough to add a full new attribute 
flag for “Warning” though. It’s a minor win with a large relative overhead, and 
explaining in the deprecation warning that flat maps that act like direct maps 
are not recommended is reasonable enough.

- Rod




> On 9 Nov 2017, at 5:43 am, John McCall via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Nov 8, 2017, at 1:20 PM, Kevin Ballard <ke...@sb.org 
>> <mailto:ke...@sb.org>> wrote:
>> 
>> On Tue, Nov 7, 2017, at 09:37 PM, John McCall wrote:
>>> 
>>>> On Nov 7, 2017, at 6:34 PM, Kevin Ballard via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> On Tue, Nov 7, 2017, at 03:23 PM, John McCall via swift-evolution wrote:
>>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md
>>>>>  
>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0187-introduce-filtermap.md>
>>>>> 
>>>>> • What is your evaluation of the proposal?
>>>> 
>>>> This proposal is going to cause an insane amount of code churn. The 
>>>> proposal suggests this overload of flatMap is used "in certain 
>>>> circumstances", but in my experience it's more like 99% of all flatMaps on 
>>>> sequences are to deal with optionals, not to flatten nested sequences.
>>>> 
>>>>> • Is the problem being addressed significant enough to warrant a change 
>>>>> to Swift?
>>>> 
>>>> I don't think so. It's a fairly minor issue, one that really only affects 
>>>> new Swift programmers anyway rather than all users, and it will cause far 
>>>> too much code churn to be worthwhile.
>>>> 
>>>> I'd much rather see a proposal to add a new @available type, something 
>>>> like 'warning', that lets you attach an arbitrary warning message to a 
>>>> call (which you can kind of do with 'deprecated' except that makes the 
>>>> warning message claim the API is deprecated).
>>> 
>>> As review manager, I generally try to avoid commenting on threads, but I 
>>> find this point interesting in a way that, if you don't mind, I'd like to 
>>> explore.
>>> 
>>> Would this attribute not be a form of deprecation?  Certainly it acts to 
>>> discourage current and subsequent use, since every such use will evoke a 
>>> warning.
>>> 
>>> Is the word "deprecation" just too strong?  Often we think of deprecated 
>>> APIs as being ones with more functional problems, like an inability to 
>>> report errors, or semantics that must have seemed like a good idea at the 
>>> time.  Here it's just that the API has a name we don't like, and perhaps 
>>> "deprecation" feels unnecessarily judgmental.
>> 
>> What I'm suggesting is that we don't change the API name at all. That's why 
>> I don't want to use 'deprecated', because we're not actually deprecating 
>> something. I'm just suggesting an alternative way of flagging cases where 
>> the user tries to use flatMap but accidentally invokes optional hoisting, 
>> and that's by making a new overload of flatMap that works for non-optional 
>> (non-sequence) values and warns the user that what they're doing is better 
>> done as a map. Using the 'deprecated' attribute for this would be confusing 
>> because it would make it sound like flatMap itself is deprecated when it's 
>> not.
> 
> I see.  Thanks.
> 
> John.
> 
>> 
>>> Also, more practically, it conflates a relatively unimportant suggestion — 
>>> that we should call the new method in order to make our code clearer — with 
>>> a more serious one — that we should revise our code to stop using a 
>>> problematic API.  Yes, the rename has a fix-it, but still: to the extent 
>>> that these things demand limited attention from the programmer, that 
>>> attention should clearly be focused on the latter set of problems.  Perhaps 
>>> that sense of severity is something that an IDE should take into 
>>> consideration when reporting problems.
>>> 
>>> What else would you have in mind for this warning?
>> 
>> The main use for this warning would be for adding overloads to methods that 
>> take optionals in order to catch the cases where people invoke optional 
>> hoisting, so we can tell them that there's a better way to handle it if they 
>> don't have an optional. flatMap vs map is the obvious example, but I'm sure 
>> there are other cases where we can do this too.
>> 
>> But there are also other once-off uses. For example, in the past I've 
>> written a function that should only ever be used for debugging, so I marked 
>> it as deprecated with a message saying 'remove this before committing your 
>> code'. This warning would have been better done using the new 'warning' 
>> attribute instead of as a deprecation notice.
>> 
>> -Kevin Ballard
>> 
>>> John.
>>> 
>>>> With that sort of thing we could then declare
>>>> 
>>>> extension Sequence {
>>>>     @available(*, warning: "Use map instead")
>>>>     func flatMap<U>(_ f: (Element) -> U) -> [U] {
>>>>         return map(f)
>>>>     }
>>>> }
>>>> 
>>>> And now if someone writes flatMap in a way that invokes optional hoisting, 
>>>> it'll match this overload instead and warn them.
>>>> 
>>>>> • How much effort did you put into your review? A glance, a quick 
>>>>> reading, or an in-depth study?
>>>> 
>>>> A quick reading, and a couple of minutes testing overload behavior with 
>>>> availability attributes (to confirm that we can't simply use 'unavailable' 
>>>> for this).
>>>> 
>>>> -Kevin Ballard
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to