> On Oct 17, 2017, at 10:54 AM, Adam Kemp <adam_k...@apple.com> wrote:
> 
> 
> 
>> On Oct 17, 2017, at 10:41 AM, Kevin Nattinger via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> On Oct 17, 2017, at 10:36 AM, Adam Kemp <adam_k...@apple.com 
>>> <mailto:adam_k...@apple.com>> wrote:
>>> 
>>> 
>>>> On Oct 17, 2017, at 10:00 AM, Kevin Nattinger <sw...@nattinger.net 
>>>> <mailto:sw...@nattinger.net>> wrote:
>>>> 
>>>> Once we allow covariant functions to satisfy protocol requirements and 
>>>> have generalized existentials and recursive protocol requirements, 
>>>> wouldn't we be able to update thusly:
>>>> 
>>>> protocol Unordered {
>>>>    func map<T>(…) -> Any<U: Unordered where U.Element == T>
>>>> }
>>>> protocol Ordered: Unordered {
>>>>    func map<T>(…) -> Any<O: Ordered where O.Element == T>
>>>> }
>>>> 
>>> 
>>> Now apply that to every order-preserving function that takes a Sequence and 
>>> returns another Sequence. You’ve moved the burden from users of API to 
>>> implementers of API. It reminds me of the const/non-const split that C++ 
>>> developers have to deal with, where a lot of functions end up being 
>>> implemented twice so that you can have a const version and a non-const 
>>> version (generally one just calls the other). It’s a pain. I don’t want 
>>> that when working with Sequences. I don’t think it’s worth it. And FWIW, 
>>> when I was programming in C# I wrote functions that took an IEnumerable<T> 
>>> and return another IEnumerable<T> very often. It’s a powerful feature that 
>>> would have been ruined by a change like this.
>> 
>> The idea is that covariance would mean you only need to implement the 
>> function once.
> 
> In the example you showed above map is written twice. Maybe the two protocols 
> can share an implementation, but you still have to have two versions declared 
> somewhere.

Perhaps I'm wrong, but (once we allow covariant conformance) wouldn't a single 
implementation of the `Ordered` version be covariant and thus satisfy the 
`Unordered` requirement without even having a dummy implementation forwarding 
to it? That's what I'm aiming for. 

> 
> What does it look like if you’re just writing a single function somewhere 
> that takes in a Sequence and returns another Sequence? How do you make that 
> function take both ordered and unordered Sequences? To make it concrete, say 
> you write a function that just wraps map:
> 
> func firstNames(ofPeople people: Sequence<Person>) -> Sequence<Person> {
>     return people.map { $0.firstName }
> }

Hmm, I'm not sure that would work with the covariant requirement. The 
associated type one could:
func firstNames<U: Unordered>(ofPeople people: U<MapResultType: Person>) -> 
U.MapResultType<Element: String> {
        return people.map { $0.firstName }
}

If the sequence you put in maps to an ordered sequence, you get the ordered 
sequence out. 
That said, I can see how the generics there could get out-of-hand as you add 
more operations… -> U.MapResultType.FilterResultType.MapResultType…<Element: 
String>

I'm planning on playing with this all before opening a real proposal, if/when I 
can figure out how, so I'm sure I'll have to deal with these and similar 
issues. Definitely good things to keep an eye out for, thanks.

> 
> I want that function to work on both ordered and unordered Sequences, and if 
> you start with an ordered Sequence you should end up with an ordered 
> Sequence. How do I make that work?
> 
>> If there are no real-world problems, why do we feel the need to change the 
>> function name in the first place?
> 
> To quote myself from an earlier email: "I’m not even sure a name change is 
> necessary for this method at all, but I’m not at all in favor of anything 
> beyond that.”
> 
> To extend that, I’m content with doing nothing. I’m not sure there’s cause 
> for doing anything at all, and I’m very sure that no one on this list has 
> demonstrated any need for a major change to the library, let alone new 
> language features.

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

Reply via email to