> Am 08.06.2016 um 23:37 schrieb Austin Zheng via swift-evolution 
> <[email protected]>:
> 
> func doSomething<T : Collection where T.Element == Int>(x: T, y: T) {
>       // Get indexes out of x and use them to index into y
>       var idx = x.startIndex
>       while (idx != x.endIndex || idx != y.endIndex) {
>               print(x[idx])
>               print(y[idx])
>               idx = x.nextIndex(idx)
>       }
> }
> let someSeq : Any<Collection where .Element == Int> = // ...
> let anotherSeq : Any<Collection where .Element == Int> = // ...
> // Trouble!
> // someSeq and anotherSeq are the same existential type
> // But the concrete index types within each of the existential variables may 
> be different
> doSomething(someSeq, anotherSeq)
> 
> It's this situation (using an existential type to fulfill a generic type 
> parameter constrained to the same requirements that comprise that 
> existential) that requires either of the two options that Dave presented, due 
> to our lack of compile-time type information about the fulfilling type's 
> associated types.
> 

Ok, that’s indeed a type error and I think that I now see why Any<Collection 
where .Element == Int> does not conform to T: Collection where T.Element == 
Int. This is because T stands for one *fixed* type out of the set of types 
described by Any<Collection where .Element == Int> whereas Any<Collection where 
.Element == Int> stands for *all* of them, which is more, so it cannot conform 
to T.

So doSomething(someSeq, anotherSeq) would be a type error and I’m fine with 
that.

We could try to write

func doSomething<T: Any<Collection where T.Element == Int>>(x: T, y: T) { … }

but then we wouldn’t be able to write the body as desired, because x.Index 
would be a different type from y.Index (and rightly so).

I think all this is fine, though. The above method doSomething() can only be 
written with runtime casts of the indices by opening them explicitly with one 
of the proposed syntaxes.

-Thorsten



_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to