[swift-evolution] [Pitch] KeyPath based map, flatMap, filter
Karl Wagner
razielim at gmail.com
Sun Jul 9 06:09:43 CDT 2017
I agree that it should be completely implicit.
KeyPaths are simply chains of partially-applied properties and subscripts. At the same time, it was noted in the KeyPath proposal that a similar mechanism might be used to model chains of partially-applied functions. I think that having both types be convertible to a closure would be sensible.
In fact, you could argue for a general-purpose “Executable” protocol which would allow any conforming object to be implicitly used as a function/closure. Command-style objects such as predictes and transformers would also benefit from such a feature.
- Karl
>
> On Jul 8, 2017 at 11:56 pm, <Benjamin Herzog via swift-evolution (mailto:swift-evolution at swift.org)> wrote:
>
>
>
> Is this operator common in other languages? I would actually expect that the conversation is not 'almost-implicit' but completely implicit instead. I think both - a prefix and postfix operator - are not obvious enough what happens here, especially because this kind of conversion is not happening in other parts of the language.
> All conversions are implicit (from explicit type to protocol, from Swift stdlib types to Objective-C types, from any type to Any, …) currently.
>
>
>
>
> ______________________
>
>
>
> Benjamin Herzog
>
>
>
>
>
> >
> > On 8. Jul 2017, at 22:10, Hooman Mehr via swift-evolution <swift-evolution at swift.org (mailto:swift-evolution at swift.org)> wrote:
> >
> >
> >
> > I like this promote operator idea. I have been defining similar operators for specific projects almost at random. It makes sense to come up with a well-defined behavior and name for such operators, as a common practice as you suggest.
> >
> >
> > The problem with the postfix operator is that it does not currently work without an extra set of parenthesis:
> >
> >
> >
> >
> > postfix operator ^
> >
> >
> >
> > postfix func ^<T,U>(lhs: KeyPath<T,U>) -> (T)->U { return { $0[keyPath: lhs] } }
> >
> >
> >
> > struct Guy { let name: String }
> >
> >
> >
> > let guys = [
> >
> > Guy(name: "Benjamin"),
> >
> > Guy(name: "Dave"),
> >
> > Guy(name: "Brent"),
> >
> > Guy(name: "Max")
> >
> > ]
> >
> >
> >
> > guys.map(\.name^) // Error: Invalid component of Swift key path
> >
> >
> >
> > guys.map((\.name)^) // This works
> >
> >
> >
> >
> > Is this a bug?
> >
> >
> >
> > That is the reason I used a prefix operator (~) in my suggestion in the a previous e-mail on this thread.
> >
> >
> >
>
>
> _______________________________________________ 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/20170709/61ab0fd1/attachment.html>
More information about the swift-evolution
mailing list