I am very glad that this issue is getting some air time since the ‘loose’ 
definitions in `Sequence` are a pain. 

I am in the camp that thinks the best solution is to split `Sequence`. I would 
propose splitting into `Iterable` and `Sequence`, `Sequence` is ordered. `Set` 
and `Dictionary` would implement `Iterable` and a `for` loop would work with 
`Iterable`. That way only already broken code is affected. 

At present we have `Set` and `Dictionary` that are problems in the standard 
library and this justifies the split. 

If other collection types are added to the standard library that require 
further sub-division of sequence then split sequence further at that time. 

-- Howard. 

> On 14 Oct 2017, at 6:41 am, Jonathan Hull via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I would also expect lexicographicallyEquals to sort the elements (or 
> otherwise create/reference a total ordering) before checking for equality.  I 
> would be more surprised by the behavior of a function named this than 
> elementsEqual.
> 
> Given the name, I would expect elementsEqual to return true if two sequences 
> have the same elements, regardless of ordering (this would be a valuable 
> function IMHO).  I would expect lexicographicallyEquals to compare the 
> elements in some lexicographical order defined for the type which overrides 
> the internal ordering of the sequence.
> 
> Kevin is right… the real answer is that the actual intended function really 
> shouldn’t exist on unordered sequences.
> 
> Thanks,
> Jon
> 
>>> On Oct 13, 2017, at 10:12 AM, Kevin Nattinger via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> 
>>>> On Oct 13, 2017, at 10:01 AM, Michael Ilseman <milse...@apple.com> wrote:
>>>> 
>>>> 
>>>> 
>>>> On Oct 12, 2017, at 9:57 PM, Kevin Nattinger via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> –∞
>>>> 
>>>> 1. I strongly object to the proposed name. It doesn't make it more clear 
>>>> to me what the method does, and is misleading at best. Among other issues, 
>>>> "lexicographical" is defined as alphabet order, and (1) this method 
>>>> applies to objects that are not Strings, and (2) this method's behavior 
>>>> isn't any more well-defined for Strings, so that name is even more of a 
>>>> lie than the original.
>>>> 
>>> 
>>> FWIW, in the context of String, "lexicographical ordering” does not imply 
>>> human-written-language-alphabetical order at all, as there’s no universal 
>>> alphabetical ordering for human language. I.e., such a concrete notion for 
>>> Strings does not exist, not even theoretically. “Lexicographical” derives 
>>> its meaning from the mathematical usage[1] which uses that term as well as 
>>> “alphabet” without being restricted to human-written-language, in which it 
>>> means some total ordering over a finite set.
>>> 
>>> [1] https://en.wikipedia.org/wiki/Lexicographical_order
>> 
>> I see, apologies for the mistake. 
>> Regardless of the specific type of ordering, lexicographicallyEquals says to 
>> me that the objects should be sorted into lexicographical order and 
>> compared. Precisely the opposite of the proposal.
>> 
>>> 
>>>> 2. This is really just a symptom of a bigger problem. The fact that two 
>>>> Sets can compare equal and yet return different results for that method 
>>>> (among too many others) is logically inconsistent and points to a much 
>>>> deeper issue with Set and Sequence. It is probably about 3 releases too 
>>>> late to get this straightened out properly, but I'll outline the real 
>>>> issue in case someone has an idea for fixing it.
>>>> 
>>>> The root of the problem is that Set conforms to Sequence, but Sequence 
>>>> doesn't require a well-defined order. Since Set doesn't have a 
>>>> well-defined order, a significant portion of its interface is unspecified. 
>>>> The methods are implemented because they have to be, but they doesn't have 
>>>> well-defined or necessarily consistent results.
>>>> 
>>>> A sequence is, by definition, ordered. That is reflected in the fact that 
>>>> over half the methods in the main Sequence definition* make no sense and 
>>>> are not well-defined unless there is a well-defined order to the sequence 
>>>> itself. What does it even mean to `dropFirst()` in a Set? The fact that 
>>>> two objects that compare equal can give different results for a 100% 
>>>> deterministic function is illogical, nonsensical, and dangerous.
>>>> 
>>>> * 7/12 by my count, ignoring `_*` funcs but including the `var`
>>>> 
>>>> The current contents of Sequence can be cleanly divided into two groups; 
>>>> those that return SubSequence imply a specific ordering, and the rest do 
>>>> not.
>>>> 
>>>>  I think those should be/should have been two separate protocols:
>>>> 
>>>> public protocol Iterable {
>>>>   associatedtype Iterator: IteratorProtocol
>>>>   func map<T>(...) -> [T] // Iterable where .Iterator.Element == T
>>>>   func filter(...) -> [Iterator.Element] // Iterable where 
>>>> .Iterator.Element == Self.Iterator.Element
>>>>   func forEach(...)
>>>>   func makeIterator() -> Iterator
>>>>   var underestimatedCount: Int { get }
>>>> }
>>>> 
>>>> public protocol Sequence: Iterable { // Maybe OrderedSequence just to make 
>>>> the well-defined-order requirement explicit
>>>>   associatedtype SubSequence
>>>>   func dropFirst(...)   -> SubSequence   // Sequence where 
>>>> .Iterator.Element == Self.Iterator.Element
>>>>   func dropLast(...)    -> SubSequence   //    " "
>>>>   func drop(while...)   -> SubSequence   //    " "
>>>>   func prefix(...)      -> SubSequence   //    " "
>>>>   func prefix(while...) -> SubSequence   //    " "
>>>>   func suffix(...)      -> SubSequence   //    " "
>>>>   func split(...where...)  -> [SubSequence] // Iterable where 
>>>> .Iterator.Element == (Sequence where .Iterator.Element == 
>>>> Self.Iterator.Element)
>>>> }
>>>> 
>>>> (The comments, of course, would be more sensible types once the ideas can 
>>>> actually be expressed in Swift)
>>>> 
>>>> Then unordered collections (Set and Dictionary) would just conform to 
>>>> Iterable and not Sequence, so ALL the methods on those classes would make 
>>>> logical sense and have well-defined behavior; no change would be needed 
>>>> for ordered collections.
>>>> 
>>>> Now, the practical matter. If this were Swift 1->2 or 2->3, I doubt there 
>>>> would be a significant issue with actually making this change. 
>>>> Unfortunately, we're well beyond that and making a change this deep is an 
>>>> enormous deal. So I see two ways forward.
>>>> 
>>>> 1. We could go ahead and make this separation. Although it's a potentially 
>>>> large breaking change, I would argue that because the methods are 
>>>> ill-defined anyway, the breakage is justified and a net benefit.
>>>> 
>>>> 2. We could try and think of a way to make the distinction between ordered 
>>>> and unordered "sequences" in a less-breaking manner. Unfortunately, I 
>>>> don't have a good suggestion for this, but if anyone has ideas, I'm all 
>>>> ears. Or eyes, as the case may be.
>>>> 
>>>> 
>>>>> On Oct 12, 2017, at 4:24 PM, Xiaodi Wu via swift-evolution 
>>>>> <swift-evolution@swift.org> wrote:
>>>>> 
>>>>> Rename Sequence.elementsEqual
>>>>> 
>>>>> Proposal: SE-NNNN
>>>>> Authors: Xiaodi Wu
>>>>> Review Manager: TBD
>>>>> Status: Awaiting review
>>>>> Introduction
>>>>> 
>>>>> The current behavior of Sequence.elementsEqual is potentially confusing 
>>>>> to users given its name. Having surveyed the alternative solutions to 
>>>>> this problem, it is proposed that the method be renamed to 
>>>>> Sequence.lexicographicallyEquals.
>>>>> 
>>>>> [...]
>>>> _______________________________________________
>>>> 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
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to