> On Oct 17, 2017, at 10:41 AM, Kevin Nattinger via swift-evolution 
> <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.

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 }
}

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