So the only real downside of this is that if you don’t refer/use all of the
generic types in this sort of situation, then it couldn’t figure it out? So the
following wouldn’t be a problem even if rule 1 was eliminated because this
actually ties other.value to self’s value and implies that other must be
GenericBox<Contents>?
struct GenericBox<Contents: AnyObject> {
let value: Contents
func test(other: GenericBox) -> Bool {
return value === other.value
}
}
I might be totally not understanding, though. :P
l8r
Sean
> On Jun 23, 2016, at 3:30 PM, Slava Pestov via swift-evolution
> <[email protected]> wrote:
>
>
>> On Jun 23, 2016, at 1:27 PM, Xiaodi Wu <[email protected]> wrote:
>>
>> When you mention the difficulty of an alternative, is that to say that it's
>> not feasible for the GenericBox in the last example to be resolved as
>> GenericBox<T>? From an end-user point of view, that seems to be the most
>> sensible behavior.
>
> With my proposed change, GenericBox would be resolved as GenericBox<T> in the
> last example. Right now it fails to type check.
>
> Here is an example that works right now, but would not work with my proposed
> change:
>
> struct GenericBox<Contents> {
> // Currently Swift resolves this as ‘GenericBox<Contents>’
> // With the new rule, we cannot infer the parameter, because there’s no
> expression to infer it from
> func combine(other: GenericBox) {
> …
> }
> }
>
> Basically the meaning of ‘GenericBox’ right now depends on whether it appears
> inside its own definition or extension thereof, or not. The behavior when it
> appears elsewhere is more general — we infer the parameters from the
> surrounding expression, instead of assuming they’re equal to the context
> parameters.
>
> This is a subtle change — definitely let me know if I’m not explaining it
> well.
>
> Slava
>
>> On Thu, Jun 23, 2016 at 15:14 Slava Pestov via swift-evolution
>> <[email protected]> wrote:
>> Simpler interpretation of a reference to a generic type with no arguments
>>
>> • Proposal: SE-9999
>> • Author: Slava Pestov
>> • Status: Awaiting review
>> • Review manager: TBD
>> Introduction
>>
>> This proposal cleans up the semantics of a reference to a generic type when
>> no generic arguments are applied.
>>
>> Swift-evolution thread: Discussion thread topic for that proposal
>>
>> Motivation
>>
>> Right now, we allow a generic type to be referenced with no generic
>> arguments applied in a handful of special cases. The two primary rules here
>> are the following:
>>
>> • If the scope from which the reference is made is nested inside the
>> definition of the type or an extension thereof, omitting generic arguments
>> just means to implicitly apply the arguments from context.
>>
>> For example,
>>
>> struct GenericBox<Contents>
>> {
>>
>> let
>> contents: Contents
>>
>>
>> // Equivalent to: func clone() -> GenericBox<Contents>
>>
>>
>> func clone() ->
>> GenericBox {
>>
>> return
>> GenericBox(contents: contents)
>> }
>> }
>>
>>
>> extension
>> GenericBox {
>>
>> func print
>> () {
>>
>> // Equivalent to: let cloned: GenericBox<Contents>
>>
>>
>> let cloned: GenericBox =
>> clone()
>>
>> print(cloned.
>> contents)
>> }
>> }
>>
>> • If the type is referenced from an unrelated scope, we attempt to
>> infer the generic parameters.
>>
>> For example,
>>
>> func makeABox() -> GenericBox<Int
>> > {
>>
>> // Equivalent to: GenericBox<Int>(contents: 123)
>>
>>
>> return GenericBox(contents: 123
>> )
>> }
>>
>> The problem appears when the user expects the second behavior, but instead
>> encounters the first. For example, the following does not type check:
>>
>> extension
>> GenericBox {
>>
>>
>> func transform<T>(f: Contents -> T) ->
>> GenericBox<T> {
>>
>> // We resolve 'GenericBox' as 'GenericBox<Contents>', rather than
>>
>>
>> // inferring the type parameter
>>
>>
>> return
>> GenericBox(contents: f(contents))
>> }
>> }
>>
>> Proposed solution
>>
>> The proposed solution is to remove the first rule altogether. If the generic
>> parameters cannot be inferred from context, they must be specified
>> explicitly with the usual Type<Args...> syntax.
>>
>> Detailed design
>>
>> This really just involves removing an existing piece of logic from the type
>> resolver code.
>>
>> Impact on existing code
>>
>> This will have a small impact on existing code that uses a pattern similar
>> to the above.
>>
>> Alternatives considered
>>
>> Status quo
>>
>> We could keep the current behavior, but one can argue it is not very useful,
>> and adds a special case where one is not needed.
>>
>> More complex inference of generic parameters
>>
>> We could attempt to unify the two rules for resolving a reference to a
>> generic type with no arguments, however this presents theoretical
>> difficulties with our constraint solver design. Even if it were easy to
>> implement, it would increase type checking type by creating new
>> possibilities to consider, with very little actual benefit.
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution