> On Jun 23, 2016, at 1:27 PM, Xiaodi Wu <xiaodi...@gmail.com> 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 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> Simpler interpretation of a reference to a generic type with no arguments
> 
> Proposal: SE-9999 
> <https://github.com/slavapestov/swift-evolution/blob/silly-proposals/proposals/9999-simplify-unbound-generic-type.md>
> Author: Slava Pestov <https://github.com/slavapestov>
> Status: Awaiting review
> Review manager: TBD
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#introduction>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 
> <http://news.gmane.org/gmane.comp.lang.swift.evolution>
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#motivation>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))
>   }
> }
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#proposed-solution>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.
> 
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#detailed-design>Detailed
>  design
> 
> This really just involves removing an existing piece of logic from the type 
> resolver code.
> 
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#impact-on-existing-code>Impact
>  on existing code
> 
> This will have a small impact on existing code that uses a pattern similar to 
> the above.
> 
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#alternatives-considered>Alternatives
>  considered
> 
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#status-quo>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.
> 
>  
> <https://github.com/slavapestov/swift-evolution/tree/silly-proposals/proposals#more-complex-inference-of-generic-parameters>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
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to