> On Nov 15, 2017, at 5:53 PM, John McCall <rjmcc...@apple.com> wrote:
> 
>> On Nov 15, 2017, at 7:36 PM, Greg Parker via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> On Nov 15, 2017, at 2:31 PM, BJ Homer via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>>> On Nov 15, 2017, at 3:05 PM, Tino Heth via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> Odd… exactly that is the reason why I think filterMap is the worst choice:
>>>> 
>>>> Both are established terms of art, but one has a meaning that doesn’t fit 
>>>> to the operation.
>>>> Applying filter can remove elements, but it can never change types (I feel 
>>>> kind of silly to repeat this over and over, but so far, nobody took the 
>>>> time to falsify this).
>>> 
>>> The concern about filter changing types is only relevant if you think of 
>>> the filter applying to the result of the map, instead of being a part of 
>>> the filterMap operation itself (an operation that is distinct from map).
>>> 
>>> Let’s imagine that we had this instead:
>>> 
>>> enum SelectiveMapResult<T> {
>>>     case use(T)
>>>     case ignore
>>> }
>>> 
>>> extension Sequence {
>>>     func selectiveMap<T>(_ selectiveTransform: 
>>> (Element)->SelectiveMapResult<T>) -> [T]
>>> }
>>> 
>>> let actualNumbers =
>>>     ["1", "2", "apple", "banana", "5"].selectiveMap({ 
>>> (x)->SelectiveMapResult<Int> in
>>>         if let value = Int(x) { return .use(value) }
>>>         else { return .ignore }
>>>     })
>>> 
>>> actualNumbers == [1, 2, 5]
>>> 
>>> The “selective” part of this operation doesn’t feel like it’s changing the 
>>> type of the result, because SelectiveMapResult is easily understood to not 
>>> be part of the mapping transformation; it just exists to tell us whether we 
>>> should use the result of that particular transformation. Likewise, I don’t 
>>> feel like the optional in filterMap is part of the mapping operation; it’s 
>>> just serving the same role as SelectiveMapResult. (It should be obvious 
>>> that SelectiveMapResult is just Optional with another name here.)
>> 
>> "selectiveMap" feels better in part due to grammar. "map" is obviously the 
>> verb and "selective" is obviously a modification of "map". "selectiveMap" is 
>> therefore performing some sort of special map operation. 
>> 
>> "filterMap" feels bad for the same reason that "selectMap" would feel worse 
>> than "selectiveMap". "filter" and "map" are both verbs in this context. 
>> Grammatically the analogue to "selectiveMap" would be "filteredMap" or 
>> "filteringMap". 
>> 
>> But even then "filteredMap" or "filteringMap" is insufficient to describe 
>> the operation. You additionally need to know that the "filter" here is not 
>> ordinary "filter", but instead the special case "filter { $0 != nil }".
>> 
>> 
>>> The name filterMap focuses on removing the ignored values, as does 
>>> compactMap. The name selectiveMap focuses on retaining the non-ignored 
>>> values. I’m not sure whether focusing on the positive or negative aspects 
>>> is clearer here. I don’t particularly like the name compactMap, simply 
>>> because I don’t have a lot of experience with languages that use “compact” 
>>> to mean “drop the nil values”, and without that experience it doesn’t seem 
>>> intuitive. I think filterMap is better. But if we introduced 
>>> Sequence.compact() alongside .compactMap(), I’d probably get used to it.
>> 
>> Swift doesn't use "filter" to mean "drop the nil values" either. 
>> 
>> 
>> "compactMap" is okay if "compact" is added. Is "compact" a common enough 
>> operation in practice to pull its own weight?
>> 
>> "mapSome" is great if you know about Optional.Some but terrible if you 
>> don't. ("Okay, it maps some elements, but which ones?") 
>> 
>> "mapNonNil" is obvious and ugly and perhaps its obviousness makes it a 
>> winner.
> 
> mapSome and especially mapNonNil both sound to me like they only map the 
> non-nil values in the source sequence.

I thought it did map the non-nil values in the source sequence. Did I 
misunderstand what the proposed filterMap does? It occurs to me that the 
proposal does not have a standalone description of the filterMap operation.


-- 
Greg Parker     gpar...@apple.com <mailto:gpar...@apple.com>     Runtime 
Wrangler


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

Reply via email to