[swift-evolution] [Pitch] KeyPath based map, flatMap, filter

Elviro Rocca retired.hunter.djura at gmail.com
Tue Jul 11 10:13:46 CDT 2017

Overloads are ugly. The very existence of an overloaded function usually means a lack of available abstractions, or an insufficient abstraction power in the language: exhibit A is conditional conformances to protocols.

Overloads are particularly ugly if the overloaded function's input represents basically the same thing: a KeyPath<A,B> is really (semantically) just a couple of functions, that is, (A) -> B and (inout A,B) -> (), so the (A) -> B is already there, and I like the idea of an "extraction" operator that was proposed in the thread. It would be really interesting to just use the KeyPath<A,B> itself wherever a (A) -> B is required, but this looks like a hack given the current state of Swift's type system.

But I like the fundamental idea behind the proposal: KeyPaths give Swift a boost in expressive power, and there's probably plenty of use cases that will emerge in the future.



> Il giorno 05 lug 2017, alle ore 19:08, Benjamin Herzog via swift-evolution <swift-evolution at swift.org> ha scritto:
> Hey guys,
> I would like to pitch a small convenient change to the Swift stdlib. With KeyPaths added in SE-0161 I would like to add some convenience calls to map, flatMap and filter in Sequences. To extract properties of an array of objects we currently use trailing closure syntax together with the shorthand $0 for the first closure argument. This is still kind of verbose and also hard to read in some situations.
> I think it is much better to understand what is going on when using the type safe KeyPaths for that. I already implemented a working solution and would like to pitch the idea here to get some feedback before opening the swift evolution proposal.
> I propose using 
> persons.flatMap(keyPath: \.name)
> over
> persons.flatMap { $0.name }
> Link to pull request: https://github.com/apple/swift/pull/10760 <https://github.com/apple/swift/pull/10760>
> Link to proposal draft: https://github.com/BenchR267/swift-evolution/blob/keypath-based-map/proposals/0181-keypath-based-map-flatmap-filter.md <https://github.com/BenchR267/swift-evolution/blob/keypath-based-map/proposals/0181-keypath-based-map-flatmap-filter.md>
> Thanks in advance for your feedback!
> ______________________
> Benjamin Herzog
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170711/1de40249/attachment.html>

More information about the swift-evolution mailing list