Sent from my iPad
> On May 28, 2016, at 12:40 PM, Thorsten Seitz <tseit...@icloud.com> wrote: > > >>> Am 27.05.2016 um 20:47 schrieb Matthew Johnson via swift-evolution >>> <swift-evolution@swift.org>: >>> >>> >>>> On May 27, 2016, at 12:05 PM, Charles Srstka via swift-evolution >>>> <swift-evolution@swift.org> wrote: >>>> >>>> On May 27, 2016, at 9:31 AM, plx via swift-evolution >>>> <swift-evolution@swift.org> wrote: >>>> >>>> For the Sequence/Collection it’s a lot of work for IMHO a rather minor >>>> convenience, but for more-complex type associated-type relationships it >>>> could start to pay its own way. >>> >>> Is it really that minor, though? For something so commonly encountered as >>> methods that take sequences/collections, this: >>> >>> func doSomething(foos: [Foo], bars: [Bar], bazzes: [Baz]) >>> >>> is not only a whole lot easier to type, but is worlds clearer to read than: >>> >>> func doSomething<S: SequenceType, T: SequenceType, U: SequenceType where >>> S.Generator.Element == Foo, T.Generator.Element == Bar, U.Generator.Element >>> == Baz>(foos: S, bars: T, bazzes: U) >>> >>> Not only is the latter line intimidating to look at as is, but it separates >>> the contained type from the parameters themselves. Given how unwieldy this >>> second form is, it seems almost certain that the former line will be used >>> more frequently in the real world. >> >> When generalized existentials are introduced (Austin Zheng has a proposal >> for this) you will be able to do this (assuming we switch to the `&` syntax: >> >> typealias SequenceOf<T> = Sequence where .Element == T >> >> func doSomething(foos: SequenceOf<Foo>, bars: SequenceOf<Bar>, bazzes: >> SequenceOf<Baz>) > > That’s a really nice solution, which gets even nicer with plx suggestion of > putting the typealias within the protocol like this: > > protocol Sequence { > typealias of<E> = S: Self where .Element == E > } That is very nice! > > -Thorsten > > > >> >> It’s still slightly more verbose than the array shorthand, but it’s a far >> cry from what you have to do with generics today. >> >> If you wanted it to be generic you could write it as: >> >> func doSomething<S: SequenceOf<Foo>, T: SequenceOf<Bar>, >> SequenceOf<Baz>(foos: S, bars: T, bazzes: U) >> >>> >>> Charles >>> >>> _______________________________________________ >>> 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 >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution