> On 21 Nov 2017, at 07:31, Chris Lattner <clatt...@nondot.org> wrote:
> 
> 
> 
>> On Nov 20, 2017, at 10:24 PM, David Hart <da...@hartbit.com 
>> <mailto:da...@hartbit.com>> wrote:
>> 
>> 
>> 
>> On 21 Nov 2017, at 03:17, Chris Lattner via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> Yes, I agree, we need variadic generics before we can have tuples conform 
>>> :-(
>>> 
>>> At the end of the day, you want to be able to treat “(U, V, W)” as sugar 
>>> for Tuple<U,V,W> just like we handle array sugar.  When that is possible, 
>>> Tuple is just a type like any other in the system (but we need variadics to 
>>> express it).
>> 
>> Eye-opening! Now I understand how important variadic generics are. Somebody 
>> should add that example to the Generics Manifesto. Questions:
>> 
>> • Doesn’t this simplification of the type system hoist Variadic Generics 
>> back up the list of priorities?
> 
> Not above conditional and recursive conformances.

Correct. But recursive conformances are implemented and conditional 
conformances are on the way. To rephrase my question: doesn't this 
simplification of the type system hoist Variadic Generics to be the next big 
priority after conditional conformances are finished?

>> • Would it be desirable to implement them before ABI stability to “remove” 
>> tuples from the ABI?
>> • If not, is the current ABI already flexible enough to support them if they 
>> are implemented later on?
> 
> I am not the expert on this (Doug Gregor is), but I think we can add it later 
> in an ABI additive way.
> 
> -Chris
> 
> 
> 
> 
> 
>>> Once you have that, then you could write conformances in general, as well 
>>> as conditional conformances that depend on (e.g.) all the element types 
>>> being equatable.
>>> 
>>> 
>>> We also need that to allow functions conform to protocols, because 
>>> functions aren’t "T1->T2” objects, the actual parameter list is an 
>>> inseparable part of the function type, and the parameter list needs 
>>> variadics.
>>> 
>>> -Chris
>>> 
>>>> On Nov 20, 2017, at 6:10 PM, Slava Pestov <spes...@apple.com 
>>>> <mailto:spes...@apple.com>> wrote:
>>>> 
>>>> Ignoring synthesized conformances for a second, think about how you would 
>>>> manually implement a conformance of a tuple type to a protocol. You would 
>>>> need some way to statically “iterate” over all the component types of the 
>>>> tuple — in fact this is the same as having variadic generics.
>>>> 
>>>> If we had variadic generics, we could implement tuples conforming to 
>>>> protocols, either by refactoring the compiler to allow conforming types to 
>>>> be non-nominal, or by reworking things so that a tuple is a nominal type 
>>>> with a single variadic generic parameter.
>>>> 
>>>> Slava
>>>> 
>>>>> On Nov 20, 2017, at 9:06 PM, Tony Allevato via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>> This is something I've wanted to look at for a while. A few weeks ago I 
>>>>> pushed out https://github.com/apple/swift/pull/12598 
>>>>> <https://github.com/apple/swift/pull/12598> to extend the existing 
>>>>> synthesis to handle structs/enums when a field/payload has a tuple of 
>>>>> things that are Equatable/Hashable, and in that PR it was (rightly) 
>>>>> observed, as Chris just did, that making tuples conform to protocols 
>>>>> would be a more general solution that solves the same problem you want to 
>>>>> solve here.
>>>>> 
>>>>> I'd love to dig into this more, but last time I experimented with it I 
>>>>> got stuck on places where the protocol conformance machinery expects 
>>>>> NominalTypeDecls, and I wasn't sure where the right place to hoist that 
>>>>> logic up to was (since tuples don't have a corresponding Decl from what I 
>>>>> can tell). Any pointers?
>>>>> 
>>>>> On Mon, Nov 20, 2017 at 5:51 PM Chris Lattner via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> On Nov 20, 2017, at 5:48 PM, Kelvin Ma <kelvin1...@gmail.com 
>>>>> <mailto:kelvin1...@gmail.com>> wrote:
>>>>>> the end goal here is to use tuples as a compatible currency type, to 
>>>>>> that end it makes sense for these three protocols to be handled as 
>>>>>> “compiler magic” and to disallow users from manually defining tuple 
>>>>>> conformances themselves. i’m not a fan of compiler magic, but Equatable, 
>>>>>> Hashable, and Comparable are special because they’re the basis for a lot 
>>>>>> of standard library functionality so i think the benefits of making this 
>>>>>> a special supported case outweigh the additional language opacity.
>>>>> 
>>>>> I understand your goal, but that compiler magic can’t exist until there 
>>>>> is something to hook it into.  Tuples can’t conform to protocols right 
>>>>> now, so there is nothing that can be synthesized.
>>>>> 
>>>>> -Chris
>>>>> 
>>>>> 
>>>>>> 
>>>>>> On Mon, Nov 20, 2017 at 8:42 PM, Chris Lattner <clatt...@nondot.org 
>>>>>> <mailto:clatt...@nondot.org>> wrote:
>>>>>> 
>>>>>>> On Nov 20, 2017, at 5:39 PM, Kelvin Ma via swift-evolution 
>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>> 
>>>>>>> when SE-185 
>>>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0185-synthesize-equatable-hashable.md>
>>>>>>>  went through swift evolution, it was agreed that the next logical step 
>>>>>>> <https://www.mail-archive.com/swift-evolution@swift.org/msg26162.html> 
>>>>>>> is synthesizing these conformances for tuple types, though it was left 
>>>>>>> out of the original proposal to avoid mission creep. I think now is the 
>>>>>>> time to start thinking about this. i’m also tacking on Comparable to 
>>>>>>> the other two protocols because there is precedent in the language from 
>>>>>>> SE-15 
>>>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0015-tuple-comparison-operators.md>
>>>>>>>  that tuple comparison is something that makes sense to write.
>>>>>>> 
>>>>>>> EHC conformance is even more important for tuples than it is for 
>>>>>>> structs because tuples effectively have no workaround whereas in 
>>>>>>> structs, you could just manually implement the conformance. 
>>>>>> 
>>>>>> In my opinion, you’re approaching this from the wrong direction.  The 
>>>>>> fundamental problem here is that tuples can’t conform to a protocol.  If 
>>>>>> they could, synthesizing these conformances would be straight-forward.
>>>>>> 
>>>>>> If you’re interested in pushing this forward, the discussion is “how do 
>>>>>> non-nominal types like tuples and functions conform to protocols”?
>>>>>> 
>>>>>> -Chris
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> _______________________________________________
>>>>> 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 <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 <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