On 25 November 2017 at 23:39, Xiaodi Wu <xiaodi...@gmail.com> wrote: > On Sat, Nov 25, 2017 at 5:21 PM, Mike Kluev <mike.kl...@gmail.com> wrote: > >> On 25 November 2017 at 23:07, Xiaodi Wu <xiaodi...@gmail.com> wrote: >> >>> Not sure what you’re asking. Equatable is a protocol. >>> >> >> that's the point. i mean, if user writes this: >> >> extension (Equatable, Equatable) : Equatable >> >> what *else* could he mean other than this: >> >> extension <T: Equatable, R: Equatable> (T, R) : Equatable >> > > No, it would mean extending the concrete type `(Equatable, Equatable)` > (which has other roadblocks to becoming possible because Equatable has Self > requirements). >
> >> and if it is indeed the only reasonable meaning we can think of - i'd say >> the first notation is nicer. >> >> >>> For a protocol P, (P, P) is a concrete type with two elements each of >>> existential type P. >>> >> >> this part i do not understand. protocol is not an existential type. or is >> it? >> > > Ah. You seem to be unfamiliar with protocol existentials. Protocols > (currently, only those without Self or associated type requirements, for > various implementation reasons) are themselves types. For example, you can > write: > > ``` > protocol P { } > extension Int : P { } > let x: P = 42 > ``` > thanks, indeed i was totally unaware of this. can't even find it in the language reference. if i decipher this correctly, the above example with Equatable is probably "fine" (because Equatable has self requirement) but in other cases it won't be fine. > In this example, x is of type `P`, not of type `Int`. Let's clarify the > difference: > > ``` > extension Array where Element == P { > func hi() { > print("Hello") > } > } > > extension Array where Element : P { > func hi() { > print("World!") > } > } > > let y: [P] = [x] > let z: [Int] = [x as Int] > > y.hi() // Prints "Hello" > z.hi() // Prints "World!" > ``` > > Moreover, if we do not write the first `extension Array`, then `y.hi()` > doesn't compile. This helps to illustrate that P does not conform to itself. > thanks for example. too subtle feature imho. i never thought protocol could be a type on it's own, makes the whole story more complex. Mike
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution