[swift-evolution] [swift-evolution-announce] [Review] SE-0089: Replace protocol<P1, P2> syntax with Any<P1, P2>
L. Mihalkovic
laurent.mihalkovic at gmail.com
Wed May 25 11:53:59 CDT 2016
On May 25, 2016, at 9:45 AM, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org> wrote:
>> - A few people have also noted the similarity between Any<...> and normal generic types. This is potentially confusing today, but with enough magic language features from the future, Any *could* conceivably be made a library feature in the fullness of time:
>>
>> // Let's say 'protocol' constraints indicate second-order constraint variables:
>> enum Any<Constraints: protocol> {
>> // And we have GADTs:
>> case value<T: Constraints>(T)
>> }
>>
>> // And we have user-defined value subtyping:
>> extension <Constraints: protocol, T: Constraints> T: Any<Constraints> { ... }
>
> I wanted to reply to this, because this is a beautiful dream, but if we want to treat `Any` like some kind of magical variadic generic type, that has some interesting implications for its design right now.
>
> 1) In a normal generic type, when you leave out the generic parameters, Swift infers them. (Think of casting an array literal to `Array`, which pins down the collection type but not the elements.) If `Any` were handled similarly, that would mean that `foo as Any` would not necessarily have an empty set of constraints, but would rather have an *inferred* set of constraints. If you wanted to force it to have no constraints, you would need to write `Any<>`.
>
> 2) We would not normally expect to be able to cast between a normal generic type and the instance contained in it. Instead, we would expect to use initializers, just as we're now planning to require for Objective-C bridging:
>
> let myExistentialInteger = Any<Integer>(myInt)
> let myInt2 = Int(any: myExistentialInteger)!
>
How realistic is it to plan something like that considering the details involved in something like (even just to filter it out):
let myEx = Any<Iterable>([10,"london",20,"tokyo"])
and then would you then propose something like:
let myExistentialInteger = Any<Integer>(myInt) {
func hashValue -> Int {
return 42
}
}
> Note that, if we were passing to an API which specifically expected an `Any<Integer>`, we could just write `Any(myInt)` and type inference would figure out the rest.
>
> --
> Brent Royal-Gordon
> Architechies
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
More information about the swift-evolution
mailing list