On Sat, Oct 14, 2017 at 16:22 Ole Begemann <o...@oleb.net> wrote: > > On 14. Oct 2017, at 21:55, Xiaodi Wu via swift-evolution < > swift-evolution@swift.org> wrote: > > On Sat, Oct 14, 2017 at 14:36 Benjamin G <benjamin.garrig...@gmail.com> > wrote: > >> I think what you're saying and what Kevin is saying are in way not >> contradictory : >> >> You're saying the "SpongeBob" protocol functions make sense and are >> coherent, Kevin is saying the consequence is that it creates weird >> functions for Sets, and i think you're both right. >> >> an "UnorderedSequence" may very well have a "first" element. The problem >> is that when you apply it to sets, you're not calling: >> >> mySet.generatedRandomOrderSequence().first() >> >> but >> >> mySet.first() >> >> That's where the issue stands, and that's IMHO, a symptom that the >> protocol hierarchy is a bit misleading. >> What you would like for sets isn't "first()", but "any()". >> > > 'first' is just a shorthand for 'let first; for element in sequence { > first = element; break }'. Any type that offers iterated access in a > for...in loop must, by construction, have a definable 'first'. > > Swift Sequences are deliberately allowed to be single-pass, infinite, or > unordered. A multi-pass, finite Sequence is a Collection. It's not an > oversight that 'first' is defined on Sequence and not Collection. It's not > 'weird' to ask what the first element you get on iteration must be; by > definition, iteration gives you elements sequentially and something must be > first. > > > I don't think this really changes the point you're making, but the 'first' > property is in fact defined on Collection and not Sequence. Sequence has > 'first(where:)', 'dropFirst', and 'prefix' methods, and essentially the > same argument applies to them. > > One rationale I heard (I think from Ben Cohen) for why 'first' is *not* > defined on Collection is that Sequences can be single-pass, and it would > feel weird for a seemingly innocuous property like 'first' to have side > effects. >
Good point and an important correction. It’s quite sensible to say that a *property* with side effects is more surprising. But yes, the point here is that the methods provided on Sequence all explicitly accommodate single-pass types.
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution