[swift-evolution] [Pitch] Add `mapValues` method to Dictionary

Matthew Johnson matthew at anandabits.com
Tue May 24 13:01:04 CDT 2016



Sent from my iPad

> On May 24, 2016, at 11:34 AM, Nate Cook <nate at natecook.com> wrote:
> 
> 
>> On May 24, 2016, at 7:43 AM, Matthew Johnson via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Sent from my iPad
>> 
>> On May 24, 2016, at 12:59 AM, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>>>> I have a small remark though, wouldn’t it be better to let transform be of type (Key, Value) throws -> T instead of (Value) throws -> T? You can just ignore the key (with _) if you don’t need it, but I think it might come in handy in some cases.
>>> 
>>> The problem is, that closes the door to writing many simple maps in functional style. For instance, this:
>>> 
>>>  dictionaryOfNumbers.mapValues(abs)
>>> 
>>> Would have to become this:
>>> 
>>>  dictionaryOfNumbers.mapValues { _, v in abs(v) }
>>> 
>>> (It *might* be possible to do it with `$1`, but I'm not sure; there are some limitations around that.)
>>> 
>>> A value-value map is just simpler and cleaner, while almost always giving you what you need.
>> 
>> +1.  
>> 
>> I don't think I have ever mapped keys.  Incidentally, that doesn't have the usual semantics of a map operation as you can produce duplicate keys.
> 
> I think this conversation suffers from not knowing whether Dictionary is going to receive a sequence-based initializer. There's been a proposal for that in the PR queue for quite a while. Could someone in the core team please either merge or close that proposal?
> 
> https://github.com/apple/swift-evolution/pull/125
> 
> If there's no sequence-based init, mapValues should probably produce a new Dictionary. If there is, having mapValues produce a dictionary would be redundant. I'd rather see a MapDictionary type that wraps a dictionary and only evaluates the transformation on access, rather than eagerly allocating storage and performing all the transformations.

The eager vs lazy issue has already been discussed.  Why not support both and let the user decide?

The best approach to laziness is to introduce a Map protocol that allows us to have lazy maps of various kinds, as we do with sequences and protocols.  That seems out of scope for Swift 3.  But there is no reason it should delay an eager method.

> 
> You can take a look at a rudimentary MapDictionary in this gist: https://gist.github.com/natecook1000/7cfc5c04f18237066f7aca6e9658f276
> 
> Best,
> Nate
> 
>>> -- 
>>> Brent Royal-Gordon
>>> Architechies
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 



More information about the swift-evolution mailing list