> On 21 Nov 2017, at 22:44, Douglas Gregor <dgre...@apple.com> wrote: > > > >>> On Nov 20, 2017, at 10:31 PM, Chris Lattner <clatt...@nondot.org> wrote: >>> >>> >>> >>> On Nov 20, 2017, at 10:24 PM, David Hart <da...@hartbit.com> wrote: >>> >>> >>> >>> On 21 Nov 2017, at 03:17, Chris Lattner via swift-evolution >>> <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. > > It’s in there under “extensions of structural types”, here: > https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#extensions-of-structural-types > > with this example: > > extension<...Elements : Equatable> (Elements...) : Equatable { // > extending the tuple type "(Elements...)" to be Equatable > } > >>> Questions: >>> >>> • Doesn’t this simplification of the type system hoist Variadic Generics >>> back up the list of priorities? >> >> Not above conditional and recursive conformances. > > Right, and we don’t have bandwidth to take on Another Major Generics Feature > this year. > >> >>> • Would it be desirable to implement them before ABI stability to “remove” >>> tuples from the ABI? > > Tuples are structural types in the ABI (and type system), and should remain > that way. So, I disagree with Chris’s suggestion that (U, V, W) will become > Tuple<U, V, W>. The most relevant comparison today is Optional, which is > technically a nominal type but is treated as a special case basically > everywhere in the compiler (and ABI) because it should have been a structural > type. I expect optionals to become structural types in the future (the ABI is > designed for that) and tuples to remain structural types.
Can somebody explain to me what are nominal and structural types and why Optional should really be a structural type? >>> • 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. > > Yes, we can add it to the ABI later. > > - Doug > >> >> -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> 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> 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 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> wrote: >>>>>>>> On Nov 20, 2017, at 5:48 PM, Kelvin Ma <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> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> On Nov 20, 2017, at 5:39 PM, Kelvin Ma via swift-evolution >>>>>>>>>> <swift-evolution@swift.org> wrote: >>>>>>>>>> >>>>>>>>>> when SE-185 went through swift evolution, it was agreed that the >>>>>>>>>> next logical step 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 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 >>>>>>> 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 >
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution