typealias Point = (x: Int, y: Int)
typealias Dimensions = (x: Int, y: Int)

let point: Point = (x: 5, y: 5)

let dimensions = point

Fundamentally different concepts may have labels happen to be the same. Structs 
protect against this conversion, tuples don't.

Explicit protocol conformance is justified in this way:

protocol GridPoint {
    var x: Int {get}
    var y: Int {get}
}

protocol Box {
    associatedtype UnitType
    var x: UnitType {get}
    var y: UnitType {get}
    var z: UnitType {get}
}

GridPoints obviously shouldn't be Boxes, but with implicit conformance, every 
Box would be a GridPoint.

From James F

> On 2 Jul 2016, at 07:31, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
>> On Sat, Jul 2, 2016 at 1:03 AM, James Froggatt <james.frogg...@me.com> wrote:
>> Tuples are inherently interchangable. If you want to avoid this, the safest 
>> way is to use a struct.
> 
> ```
> typealias Foo = (a: Int, b: Int)
> typealias Bar = (c: Int, d: Int)
> var foo: Foo = (1, 2)
> var bar: Bar = (3, 4)
> foo = bar
> ```
> ERROR at line 5, col 7: cannot assign value of type 'Bar' (aka '(c: Int, d: 
> Int)') to type 'Foo' (aka '(a: Int, b: Int)')
> 
> What do you mean when you say that tuples are inherently interchangeable? 
> What am I not safe from?
> 
>> 
>> Labels/naming shouldn't be relied on to provide type information,
> 
> For a tuple type, labels are treated as part of the type; I *do* rely on 
> that. Why do you say that it shouldn't be relied on?
>  
>> this is why implicit conformance to protocols is disallowed.
> 
> I don't follow.
> 
>> From James F
>> 
>>> On 2 Jul 2016, at 06:43, Xiaodi Wu <xiaodi...@gmail.com> wrote:
>>> 
>>> What's the basis for your claim that tuples are best passed around without 
>>> their labels? If I have `typealias CartesianCoordinates = (x: Double, y: 
>>> Double)`, these labels are absolutely meaningful, and I would not want them 
>>> to be interchangeable with a hypothetical `typealias PolarCoordinates = (r: 
>>> Double, theta: Double)`. Although argument labels are part of the name, 
>>> tuple labels are part of the type; there are good reasons for that, and the 
>>> two are no longer meant to be similar. This proposal takes us the rest of 
>>> the way in clarifying this important distinction.
>>> On Fri, Jul 1, 2016 at 11:52 PM James Froggatt via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>>>> A parameter list of (inout Int, @noescape Int -> ()) is just a ‘tuple + 
>>>>> annotations’ relevant to use in parameter lists. If you can restrict this 
>>>>> pseudo-type to the appropriate context, like we are heading towards with 
>>>>> disallowing ImplicityUnwrappedOptional in function signatures, why not 
>>>>> restrict certain type annotations to only occur in function signatures?
>>>> 
>>>> Effectively the presence of parameter annotations in a tuple make it a 
>>>> ‘splat-only tuple’.
>>>> 
>>>> From James F
>>>> 
>>>>> On 2 Jul 2016, at 05:38, James Froggatt <james.frogg...@me.com> wrote:
>>>>> 
>>>>> 
>>>>>> On 2 Jul 2016, at 05:03, Austin Zheng <austinzh...@gmail.com> wrote:
>>>>>> 
>>>>>> 
>>>>>>> On Jul 1, 2016, at 8:55 PM, James Froggatt <james.frogg...@me.com> 
>>>>>>> wrote:
>>>>>>> 
>>>>>>> 
>>>>>>> On 2 Jul 2016, at 04:46, Austin Zheng <austinzh...@gmail.com> wrote:
>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> This functionality naturally falls out of any decent proposal for 
>>>>>>>> variadic generics. I'd rather wait until we can re-add it in a 
>>>>>>>> principled manner than stuff yet another @-prefixed special case into 
>>>>>>>> the language.
>>>>>>>> 
>>>>>>> 
>>>>>>> Fair point, but it seems this could stand as a lightweight complement 
>>>>>>> to generics. There seems to be a lack of support for the side of 
>>>>>>> keeping what functionality we already have in this area.
>>>>>> 
>>>>>> FWIW, I liked and used tuple splat before it was removed from the 
>>>>>> language.
>>>>>> 
>>>>>> I thought about it, and I think a lightweight, limited form of tuple 
>>>>>> application would probably be worth pursuing even before variadic 
>>>>>> generics go into the language (especially since they are a low-priority 
>>>>>> item). Perhaps someone could draft a proposal for Swift 3.1.
>>>>>> 
>>>>> 
>>>>> This is why I support keeping what existing semantics we can, rather than 
>>>>> stripping it all out only to reimplement it as soon as people realise 
>>>>> it's missing.
>>>>> 
>>>>> The distinction between (Int, Int) and ((Int, Int)) seems trivial.
>>>>> 
>>>>> A parameter list of (inout Int, @noescape Int -> ()) is just a ‘tuple + 
>>>>> annotations’ relevant to use in parameter lists. If you can restrict this 
>>>>> pseudo-type to the appropriate context, like we are heading towards with 
>>>>> disallowing ImplicityUnwrappedOptional in function signatures, why not 
>>>>> restrict certain type annotations to only occur in function signatures?
>>>>> 
>>>>>>> 
>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Is it though? Couldn't the current confusing situation of tuple 
>>>>>>>>>>> labels in the type system be changed in the exact same way?
>>>>>>>>>> 
>>>>>>>>>> Tuple labels work the way you expect them to work: you can't assign 
>>>>>>>>>> an `(a: 1, b: 2)` to a variable of type `(x: Int, y: Int)`. There is 
>>>>>>>>>> nothing confusing about them, at least not in the same way that 
>>>>>>>>>> function types are.
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> This seems just the same problem as not being able to assign:
>>>>>>>>> 
>>>>>>>>> (a: Int, b: Int) -> ()
>>>>>>>>> 
>>>>>>>>> to a type of:
>>>>>>>>> 
>>>>>>>>> (x: Int, y: Int) -> ()
>>>>>>>>> 
>>>>>>>>> Functions and tuples are the only uses of labels in the type system 
>>>>>>>>> I'm aware of. The reasoning for one case seems likely to apply to the 
>>>>>>>>> other.
>>>>>>>> 
>>>>>>>> There was a better argument for this sort of thing before the naming 
>>>>>>>> guidelines. Swift 2 argument labels often described the semantic value 
>>>>>>>> of their arguments. Now you have guidelines which assign 
>>>>>>>> non-descriptive prepositional phrases as argument labels. It makes no 
>>>>>>>> sense to pull the prepositional phase comprising the argument label 
>>>>>>>> (as opposed to the argument name itself) into the type, since that 
>>>>>>>> phrase is meaningless outside the context of the primary function 
>>>>>>>> name, but the current system (and any based off it) would do just that.
>>>>>>>> 
>>>>>>>> So no, I don't think the reasoning for tuple labels applies to 
>>>>>>>> function argument labels.
>>>>>>>> 
>>>>>>> 
>>>>>>> Sorry, I meant the reasoning for removing them from the type system. As 
>>>>>>> you said, there was a better argument. I'm observing that this may once 
>>>>>>> again be the case following this change.
>>>>>> 
>>>>>> 
>>>>>> I still think it would be a bit odd to have (e.g.) a rejuvenated tuple 
>>>>>> splatter try to enforce the labels on whatever tuples you pass to it, 
>>>>>> since those labels would necessarily be tied to a specific function's 
>>>>>> name, rather than the meaning of the arguments themselves. Do you think 
>>>>>> there would be too much room for programmer error if such a splatter 
>>>>>> necessarily took in unlabeled tuples? (Right now any labeled tuple is 
>>>>>> interchangeable with a non-labeled tuple with the same constituent 
>>>>>> types...)
>>>>>> 
>>>>> 
>>>>> My idea is that if we switch to using:
>>>>> 
>>>>> let functionType(a:b:) = add(_:_:)
>>>>> 
>>>>> then it make sense to have tuples match this syntax, to avoid having two 
>>>>> similar naming mechanisms with very different semantics:
>>>>> 
>>>>> let values(x:y:) = (1, 2)
>>>>> 
>>>>> Like a function's argument labels are rarely sensible out of context, 
>>>>> tuples are best passed around without considering their labels. For 
>>>>> example:
>>>>> 
>>>>> let name: (first: String, last: String) = …
>>>>> 
>>>>> name.first //clear
>>>>> 
>>>>> func join(stringTuple: (String, String))
>>>>> 
>>>>> join(stringTuple: name) //is this allowed?
>>>>> 
>>>>> 
>>>>> At this point (generally as soon as the tuple leaves the context of its 
>>>>> containing variable), the original parameter labels are meaningless. 
>>>>> Alternatively:
>>>>> 
>>>>> 
>>>>> let name(first:last:): (String, String) = …
>>>>> 
>>>>> name.first //still clear
>>>>> 
>>>>> join(name) //clearly allowed, since the labels are not part of the type
>>>>> 
>>>>> 
>>>>> With this, if I understand you properly, argument names wouldn't be 
>>>>> present in the type system to begin with, so calling the result of a 
>>>>> splatter would be predictable:
>>>>> 
>>>>> join(a: String, b: String)
>>>>> 
>>>>> let splatted: ((String, String)) -> () = splat(join) // or splat( 
>>>>> join(a:b:) )
>>>>> 
>>>>> splatted(name) // or splatted( name(first:last:) )
>>>>> 
>>>>>>> 
>>>>>>> It doesn't help that this went through to the wrong thread, and the 
>>>>>>> quick email I sent to acknowledge this has fallen in a hole somewhere.
>>>>>>> 
>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Or are tuples destined to become nothing more than a historical 
>>>>>>>>>>> artifact? If this is the case, then we might as well remove them 
>>>>>>>>>>> now.
>>>>>>>>>> 
>>>>>>>>>> Tuples have many, many uses apart from modeling argument lists.
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> • lightweight structs
>>>>>>>>> • loosely-typed structs
>>>>>>>>> • …as structs
>>>>>>>>> 
>>>>>>>>> There is no particular reason Void must be modelled as the empty 
>>>>>>>>> struct, since any non-subclassable Type.self is likewise a singleton.
>>>>>>>>> 
>>>>>>>>> So there's nothing really making a compelling argument here.
>>>>>>>> 
>>>>>>>> What? You asked if tuples were going to become a historical artifact? 
>>>>>>>> The answer is, "no, they aren't, because they have uses besides 
>>>>>>>> modeling argument labels". Void as the empty tuple is irrelevant to 
>>>>>>>> the discussion.
>>>>>>>> 
>>>>>>> 
>>>>>>> I'm not sure how to interpret this, sorry.
>>>>>> 
>>>>>> Perhaps I misunderstood your original point. In that case, I apologize.
>>>>>> 
>>>>>>> 
>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> ------------ Begin Message ------------ 
>>>>>>>>>>> Group: gmane.comp.lang.swift.evolution 
>>>>>>>>>>> MsgID: 
>>>>>>>>>>> <caow3zebrvo92frnv2xk1y_+s2lqyvouo-fm46bpmuffof2p...@mail.gmail.com>
>>>>>>>>>>>  
>>>>>>>>>>> 
>>>>>>>>>>> On Thu, Jun 30, 2016 at 11:26 AM Chris Lattner via swift-evolution <
>>>>>>>>>>> swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org> wrote:
>>>>>>>>>>> 
>>>>>>>>>>>> Hello Swift community,
>>>>>>>>>>>> 
>>>>>>>>>>>> The review of "SE-0111: Remove type system significance of function
>>>>>>>>>>>> argument labels" begins now and runs through July 4. The proposal 
>>>>>>>>>>>> is
>>>>>>>>>>>> available here:
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md
>>>>>>>>>>>> 
>>>>>>>>>>>> Reviews are an important part of the Swift evolution process. All 
>>>>>>>>>>>> reviews
>>>>>>>>>>>> should be sent to the swift-evolution mailing list at
>>>>>>>>>>>> 
>>>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>>>>> 
>>>>>>>>>>>> or, if you would like to keep your feedback private, directly to 
>>>>>>>>>>>> the
>>>>>>>>>>>> review manager.
>>>>>>>>>>>> 
>>>>>>>>>>>> What goes into a review?
>>>>>>>>>>>> 
>>>>>>>>>>>> The goal of the review process is to improve the proposal under 
>>>>>>>>>>>> review
>>>>>>>>>>>> through constructive criticism and contribute to the direction of 
>>>>>>>>>>>> Swift.
>>>>>>>>>>>> When writing your review, here are some questions you might want 
>>>>>>>>>>>> to answer
>>>>>>>>>>>> in your review:
>>>>>>>>>>>> 
>>>>>>>>>>>> * What is your evaluation of the proposal?
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> +1. I'm in agreement with others in this thread who say that the 
>>>>>>>>>>> labels are
>>>>>>>>>>> parts of the *name* of the function, not parts of its *type*. If I
>>>>>>>>>>> understand the other discussions regarding the evolution of Swift's
>>>>>>>>>>> function arguments model, the similarity to tuples with labeled 
>>>>>>>>>>> components
>>>>>>>>>>> is a historical artifact and now merely coincidental.
>>>>>>>>>>> 
>>>>>>>>>>> The analogy to Objective-C here is obvious, where you have selectors
>>>>>>>>>>> instead of functions. The selector is the "name" of the "function" 
>>>>>>>>>>> and it
>>>>>>>>>>> contains all of the parts, not just the base name.
>>>>>>>>>>> 
>>>>>>>>>>> Swift function names to me are like German separable verbs. Even 
>>>>>>>>>>> when
>>>>>>>>>>> they're split across the sentence with multiple words in-between, 
>>>>>>>>>>> the
>>>>>>>>>>> prefix is still considered part of that verb, not a separate 
>>>>>>>>>>> word/concept.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> * Is the problem being addressed significant enough to warrant a
>>>>>>>>>>>> change to Swift?
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Yes.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> * Does this proposal fit well with the feel and direction of Swift?
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Yes. This feels like a natural follow-up to SE-0021, which allowed 
>>>>>>>>>>> the use
>>>>>>>>>>> of argument names to differentiate between overloads with the same 
>>>>>>>>>>> argument
>>>>>>>>>>> types at the same positions. To me, this is another admission that 
>>>>>>>>>>> the
>>>>>>>>>>> labels are part of the function's *name*.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> * If you have used other languages or libraries with a similar
>>>>>>>>>>>> feature, how do you feel that this proposal compares to those?
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Aside from Objective-C mentioned above, the other languages I've 
>>>>>>>>>>> used that
>>>>>>>>>>> have named/keyword arguments (like Python) are dynamic languages 
>>>>>>>>>>> that treat
>>>>>>>>>>> the incoming argument list as a dictionary; in that case, the 
>>>>>>>>>>> language
>>>>>>>>>>> design is significantly different and I can't draw an analogy 
>>>>>>>>>>> between them.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> * How much effort did you put into your review? A glance, a quick
>>>>>>>>>>>> reading, or an in-depth study?
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Read the proposal and loosely followed the discussion.
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> More information about the Swift evolution process is available at
>>>>>>>>>>>> 
>>>>>>>>>>>> https://github.com/apple/swift-evolution/blob/master/process.md
>>>>>>>>>>>> 
>>>>>>>>>>>> Thank you,
>>>>>>>>>>>> 
>>>>>>>>>>>> -Chris Lattner
>>>>>>>>>>>> Review Manager
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> _______________________________________________
>>>>>>>>>>>> swift-evolution mailing list
>>>>>>>>>>>> swift-evolution-m3fhrko0vlzytjvyw6y...@public.gmane.org
>>>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> ------------- End Message ------------- 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> From James F
>>>>>>>>>>> _______________________________________________
>>>>>>>>>>> swift-evolution mailing list
>>>>>>>>>>> swift-evolution@swift.org
>>>>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org
>>>> 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