Regards (From mobile)
> On Jun 25, 2016, at 8:48 PM, Thorsten Seitz <tseit...@icloud.com> wrote: > > >> Am 25.06.2016 um 19:09 schrieb L. Mihalkovic <laurent.mihalko...@gmail.com>: >> >> >> >> Regards >> (From mobile) >> >>> On Jun 25, 2016, at 6:34 PM, Thorsten Seitz via swift-evolution >>> <swift-evolution@swift.org> wrote: >>> >>> Sorry for the late reply — I had hoped to be able to think more deeply >>> about various points, >>> but I’m going to delay that instead of delaying the reply even more :-) >>> >>> >>>> Am 17.06.2016 um 19:04 schrieb Dave Abrahams <dabrah...@apple.com>: >>>> >>>> >>>> on Thu Jun 16 2016, Thorsten Seitz <tseitz42-AT-icloud.com> wrote: >>>> >>>>>> Am 13.06.2016 um 04:04 schrieb Dave Abrahams <dabrah...@apple.com>: >>>>>> >>>>>> >>>>>> on Fri Jun 10 2016, Thorsten Seitz <tseitz42-AT-icloud.com> wrote: >>>>>> >>>>>>>>> Am 09.06.2016 um 19:50 schrieb Thorsten Seitz via swift-evolution >>>>>>>>> <swift-evolution@swift.org>: >>>>>>>>> >>>>>>>>> >>>>>>>>> Am 09.06.2016 um 18:49 schrieb Dave Abrahams via swift-evolution >>>>>>>>> <swift-evolution@swift.org>: >>>>>>> >>>>>>>>> >>>>>>>>> on Wed Jun 08 2016, Jordan Rose <swift-evolution@swift.org> wrote: >>>>>>>>> >>>>>>>>>>> On Jun 8, 2016, at 13:16, Dave Abrahams via swift-evolution >>>>>>>>>>> <swift-evolution@swift.org> wrote: >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> on Wed Jun 08 2016, Thorsten Seitz >>>>>>>>>> >>>>>>>>>>> <swift-evolution@swift.org >>>>>>>>>>> <mailto:swift-evolution@swift.org>> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Ah, thanks, I forgot! I still consider this a bug, though (will >>>>>>>>>>>> have >>>>>>>>>>>> to read up again what the reasons are for that behavior). >>>>>>>>>>> >>>>>>>>>>> Yes, but in the case of the issue we're discussing, the choices are: >>>>>>>>>>> >>>>>>>>>>> 1. Omit from the existential's API any protocol requirements that >>>>>>>>>>> depend >>>>>>>>>>> on Self or associated types, in which case it *can't* conform to >>>>>>>>>>> itself because it doesn't fulfill the requirements. >>>>>>>>>>> >>>>>>>>>>> 2. Erase type relationships and trap at runtime when they don't >>>>>>>>>>> line up. >>>>>>>>>>> >>>>>>>>>>> Matthew has been arguing against #2, but you can't “fix the bug” >>>>>>>>>>> without >>>>>>>>>>> it. >>>>>>>>>> >>>>>>>>>> #1 has been my preference for a while as well, at least as a starting >>>>>>>>>> point. >>>>>>>>> >>>>>>>>> I should point out that with the resyntaxing of existentials to >>>>>>>>> Any<Protocols...>, the idea that Collection's existential doesn't >>>>>>>>> conform to Collection becomes far less absurd than it was, so maybe >>>>>>>>> this >>>>>>>>> is not so bad. >>>>>>>> >>>>>>>> I think the problem is more that Any<Collection> does not conform to >>>>>>>> a specific value for a type parameter T: Collection >>>>>>>> >>>>>>>> What I mean by this is that `Collection` denotes a type family, a >>>>>>>> generic parameter `T: Collection` denotes a specific (though >>>>>>>> unknown) member of that type family and `Any<Collection>` denotes >>>>>>>> the type family again, so there is really no point in writing >>>>>>>> Any<Collection> IMO. >>>>>>>> The type family cannot conform to T because T is just one fixed member >>>>>>>> of it. >>>>>>>> It conforms to itself, though, as I can write >>>>>>>> let c1: Any<Collection> = … >>>>>>>> let c2: Any<Collection> = c1 >>>>>>>> >>>>>>>> That’s why I think that we could just drop Any<Collection> and simply >>>>>>>> write Collection. >>>>>>> >>>>>>> Let me expand that a bit: >>>>>>> >>>>>>> Actually all this talk about existentials vs. generics or protocols >>>>>>> vs. classes has had me confused somewhat and I think there are still >>>>>>> some misconceptions present on this list sometimes, so I’ll try to >>>>>>> clear them up: >>>>>> >>>>>> There are several objectively incorrect statements here, and several >>>>>> others with which I disagree. I was hoping someone else would write >>>>>> this for me, but since the post has such a tone of authority I feel I >>>>>> must respond. >>>>> >>>>> You are right, the tone of my post was not appropriate, for which I >>>>> want to apologize sincerely. >>>> >>>> My fundamental disagreement is with the content, not the tone. >>>> >>>>> I still believe my statements to be valid, though, and will respond to >>>>> your arguments inline. Please don't get me wrong, I'm not trying to >>>>> have an argument for the argument's sake. All I want is to contribute >>>>> maybe a tiny bit to make Swift even better than it already is, by >>>>> sharing ideas and thoughts not only from me but from the designs of >>>>> other perhaps more obscure programming languages which I happen to >>>>> have stumbled upon in the past (often with much delight). >>>> >>>> And I want you to know, even though I disagree with what you've written, >>>> that I very much appreciate the contribution you're making. >>> >>> Thanks! I’m very glad about that! >>> >>> >>>> >>>>>>> (1) misconception: protocols with associated types are somehow very >>>>>>> different from generics >>>>>>> >>>>>>> I don’t think they are and I will explain why. The only difference is >>>>>>> the way the type parameters are bound: generics use explicit parameter >>>>>>> lists whereas protocols use inheritance. That has some advantages >>>>>>> (think long parameter lists of generics) and some disadvantages. >>>>>>> These ways are dual in a notation sense: generic types have to have >>>>>>> all parameters bound whereas protocols cannot bind any of them. >>>>>>> The „existential“ notation `Any<>` being discussed on this list is >>>>>>> nothing more than adding the ability to protocols to bind the >>>>>>> parameters to be used just like Java’s wildcards are adding the >>>>>>> opposite feature to generics, namely not having to bind all >>>>>>> parameters. >>>>>> >>>>>> Protocols and generics fulfill completely different roles in Swift, and >>>>>> so, **especially in a language design context like the one we're in >>>>>> here**, must be thought of differently. The former are an abstraction >>>>>> mechanism for APIs, and the latter a mechanism for generalizing >>>>>> implementations. >>>>> >>>>> That's not what I was talking about. Of course, protocols are a >>>>> mechanism for deriving types from each other whereas generics are a >>>>> way to parameterize types. My point was that Swift's other way to >>>>> parameterize types, namely by associated types, is very similar to >>>>> generics with wildcards when looking a the existentials of such >>>>> protocols. In addition I was talking about generics in general, not >>>>> just about generics in Swift which restricts them to implementations >>>>> and does not support wildcards. >>>> >>>> I'm aware of these other systems. One of the problems with the way >>>> you're writing about this is that we're speaking in the context of Swift >>>> and you're assuming a completely open design space, as though Swift's >>>> choice to sharply distinguish classes from protocols was not a conscious >>>> one... but it was. >>> >>> I never had assumed that this had been decided lightly ;-) >>> And I have been favorably impressed by the rationales put forth so far by >>> the Swift >>> team, so it would definitely be interesting to learn a bit more about the >>> rationale >>> being put into that decision and the advantages and disadvantages discussed >>> back then. >>> Is there something written down somewhere? >>> >> >> I think some applicable rational exist in type-system papers that came out >> of studying scala's. >> >>>> Yes, Swift could have been designed differently, so >>>> that a single language construct, a kind of generic class, was stretched >>>> so it could express almost everything. Personally, I don't believe that >>>> results in a better language. >>> >>> I still believe it would have advantages but I’ll concede that this >>> discussion >>> will probably not help advancing Swift as this decision has been made. >>> Still, it might be of interest to keep in mind for further design >>> considerations. >> >> Somehow the world of languages is small, and tracing inspiriation across is >> playing permutations on a limited set. >> >>> >>>> >>>>> Other languages like Java offer generics for interfaces as well and >>>>> support wildcards (adding generic types parameters to protocols in >>>>> Swift is currently discussed on the mailing list as well). FWIW my >>>>> arguments were not about whether we should have wildcards in Swift or >>>>> not, but simply to relate one parametrization feature (associated >>>>> types) to a more well known parametrization feature (generics with >>>>> wildcards) in order to understand them better. >>>>> >>>>>> The only place you could argue that they intersect is >>>>>> in generic non-final classes, because a class fills the dual role of >>>>>> abstraction and implementation mechanism (and some might say that's a >>>>>> weakness). But even accounting for generic classes, protocols with >>>>>> associated types are very different from generics. Two utterly >>>>>> different types (an enum and a struct, for example) can conform to any >>>>>> given protocol P, but generic types always share a common basis >>>>>> implementation. >>>>> >>>>> The latter is not the case for generic interfaces in Java, for >>>>> example, so it is just an artificial restriction present in Swift. >>>> >>>> It's not an artificial restriction, it's a design choice. Sure, if by >>> >>> I meant artifical in the sense that a different design choice would have >>> been possible. >>> >>> >>>> “generic type” you just mean anything that encodes a static type >>>> relationship, lots of things fall into that bucket. >>> >>> Well, I think Java’s generics are not that advanced, so the bucket does not >>> have to be very big :-) >> >> I am curious to see what language you have in mind when you are making a >> comparison? > > e.g. Ceylon and Scala with their definition-site variance declarations, > Ceylon with defaults for type parameters, Scala with lower type bounds, Scala > and Haskell with higher kinded types, Haskell with type classes, type > families, kind polymorphism and lots more. Then there are things like types > parameterized by values (like discussed on this list in the thread about > expanding generics to support defining a type safe unit system). > this was just about which generics you were familiar with, and were comparing with Java's. Considering how you seemed to indicate how puny the latter is compared to others i was expecting a more light-bulb-moment answer. I would have added kotlin and c# especially considering how their their definition-site syntax is the same. But more so kotlin if i had to name a type system with generics really dwarfing java's. :-) > The design space is much larger than the mainstream, especially something > like Java, makes on believe… :-) ... or ceylon ;-) > -Thorsten > > >> >>> >>> >>>> >>>>>> There is no way to produce distinct instances of a generic type with >>>>>> all its type parameters bound, >>>>> >>>>> That is true in Swift (except for generic classes) due to the >>>>> restriction just mentioned. >>>>> >>>>>> but for any protocol P I can make infinitely many instances of P with >>>>>> P.AssociatedType == Int. >>>>> >>>>> This likewise applies to generic interfaces and for generic types in >>>>> general if taking inheritance into account - just like you do here for >>>>> protocols. >>>>> >>>>>> Back to the my original point: while protocols and generic types have >>>>>> some similarities, the idea that they are fundamentally the same thing >>>>>> (I know you didn't say *exactly* that, but I think it will be read that >>>>>> way) would be wrong and a very unproductive way to approach language >>>>>> evolution. >>>>> >>>>> I said that protocols *with associated types* are much like generics >>>>> *with wildcards* and tried to show why. >>>> >>>> If all you're trying to do is say that there's an analogy there, then we >>>> have no argument. >>> >>> Ok. >>> >>> >>>> >>>>>>> Essentially `Any<Collection>` in Swift is just the same as >>>>>>> `Collection<?>` in Java (assuming for comparability’s sake that >>>>>>> Swift’s Collection had no additional associated types; otherwise I >>>>>>> would just have to introduce a Collection<Element, Index> in Java). >>>>>> >>>>>> I don't see how you can use an example that requires *assuming away* >>>>>> assoociated types to justify an argument that protocols *with associated >>>>>> types* are the same as generics. >>>>> >>>>> Note, that I said *additional* associated types, i.e. in addition to >>>>> .Element, even giving an example how the Java interface had to be >>>>> extended by a type parameter `Index` if this assumption was not >>>>> applied (still simplifying because Generator would have been more >>>>> correct which would have to be added as type parameter in addition to >>>>> `Index`). >>>>> >>>>> So, in essence the comparison is between the following (I'm using Foo >>>>> now instead of Collection to avoid the differences mentioned. Note >>>>> that this has no impact on the argument at all): >>>>> >>>>> protocol Foo { >>>>> associatedtype T >>>>> ... >>>>> } >>>>> >>>>> interface Foo<T> { >>>>> ... >>>>> } >>>> >>>> Yes, those correspond. >>>> >>>>> My argument is that existentials of protocols with associated types >>>>> are just like generic types with wildcards, i.e. `Any<Foo>` in Swift >>>>> is just the same as `Foo<?>` in Java. >>>>> Likewise `Any<Foo where .T: Number>` is just the same as `Foo<? >>>>> extends Number>` in Java. For me that was an insight I wanted to >>>>> share. >>>> >>>> It's a good one. >>> >>> Thanks! >>> >>> >>>> >>>>>>> And just like Collection<?> does not conform to a type parameter `T >>>>>>> extends Collection<?>` because Collection<?> is the type `forall >>>>>>> E. Collection<E>` whereas `T extends Collection<?>` is the type >>>>>>> `T. Collection<T>` for a given T. >>>>>>> >>>>>>> In essence protocols with associated types are like generics with >>>>>>> wildcards. >>>>>> >>>>>> It is true that generics with wildcards in Java *are* (not just “like”) >>>>>> existential types but I don't agree with the statement above. Because >>>>>> Java tries to create an “everything is a class” world, generic classes >>>>>> with bound type parameters end up playing the role of existential type. >>>>>> But protocols in Swift are not, fundamentally, just existential types, >>>>>> and the resyntaxing of ProtocolName to Any<ProtocolName> for use in type >>>>>> context is a huge leap forward in making that distinction clear... when >>>>>> that's done (unless we leave Array<ProtocolName> around as a synonym for >>>>>> Array<Any<ProtocolName>>—I really hope we won't!) protocols indeed >>>>>> *won't* be types at all, existential or otherwise. >>>>> >>>>> I fully agree that protocols are not types, their existentials >>>>> are. But I haven't seen yet what we really *gain* from making that >>>>> distinction explicit (except an ugly type syntax :-). >>>> >>>> For me, it helps distinguish static from dynamic polymorphism. >>> >>> Hmm, I’ll have to think more about that. >>> >>> >>>> >>>>> And like I already wrote in this or another thread we would have to >>>>> apply the same logic to non-final classes, which are existentials, >>>>> too. >>>>>> >>>>>>> Coming back to the questions whether (a) allowing existentials to be >>>>>>> used as types is useful >>>>>> >>>>>> That's the only use existentials have. They *are* types. Of course >>>>>> they're useful, and I don't think anyone was arguing otherwise. >>>>> >>>>> I'm pretty sure that there was a discussion about whether being able >>>>> to write something like Any<Collection> is useful. My wording was >>>>> certainly imprecise, though, and didn't make sense as written. I >>>>> should have said something like "whether adding the ability to use >>>>> existential types of protocols with unbound associated types is >>>>> useful". >>>>> >>>>>> >>>>>>> and (b) whether sacrificing type safety would somehow be necessary for >>>>>>> that, I think we can safely answer (a) yes, it *is* useful to be able >>>>>>> to use existentials like Any<Collection> as types, because wildcards >>>>>>> are quite often needed and very useful in Java (they haven’t been >>>>>>> added without a reason) (b) no, sacrificing type safety does not make >>>>>>> sense, as the experience with Java’s wildcards shows that this is not >>>>>>> needed. >>>>>> >>>>>> I would call this “interesting information,” but hardly conclusive. >>>>>> Java's generics are almost exactly the same thing as Objective-C >>>>>> lightweight generics, which are less capable and less expressive in >>>>>> many ways than Swift's generics. >>>>> >>>>> I agree that Java does not have something like `Self` or associated >>>>> types (which are really useful for not having to bind all type >>>>> parameters explicitly, especially when binding type parameters to >>>>> other generics which makes for long type parameter lists in Java where >>>>> I have to repeat everything over and over again), but do you mean >>>>> something else here? >>>>> Especially in the context of sacrificing type safety? >>>> >>>> I do, but it will take some research for me to recover my memory of >>>> where the holes are. It has been years since I thought about Java >>>> generics. It's also possible that I'm wrong ;-) >>> >>> If you happen to remember, I’d be interested in hearing about the problems >>> you meant. >>> >>> >>>> >>>>>>> Especially if something like path dependent types is used like >>>>>>> proposed and some notation to open an existential’s type is added, >>>>>>> which is both something that Java does not have. >>>>>>> >>>>>>> (2) misconception: POP is different from OOP >>>>>>> >>>>>>> It is not. Protocols are just interfaces using subtyping like OOP has >>>>>>> always done. They just use associated types instead of explicit type >>>>>>> parameters for generics (see above). >>>>>> >>>>>> They are not the same thing at all (see above ;->). To add to the list >>>>>> above, protocols can express fundamental relationships—like Self >>>>>> requirements—that OOP simply can't handle. >>>>> >>>>> Eiffel has something like Self, it is called anchoring and allows >>>>> binding the type of a variable to that of another one or self (which >>>>> is called `Current` in Eiffel). And Eiffel does model everything with >>>>> classes which may be abstract and allow for real multiple inheritance >>>>> with abilities to resolve all conflicts including those concerning >>>>> state (which is what other languages introduce interfaces for to avoid >>>>> conflicts concerning state while still failing to solve *semantic* >>>>> conflicts with the same diamond pattern). >>>>> No protocols or interfaces needed. Why do you say this is not OOP? The >>>>> book which describes Eiffel is called "Object-Oriented Software >>>>> Construction" (and is now about 20 years old). >>>> >>>> It's not *incompatible* with OOP, but it is not part of the essence of >>>> OOP either. If you survey object-oriented languages, what you find in >>>> common is inheritance-based dynamic polymorphism and reference >>>> semantics. Those are the defining characteristics of OOP, and taking an >>>> object-oriented approach to a given problem means reaching for those >>>> features. >>> >>> Agreed, it is not part of most OOP *implementations* while being compatible >>> with OOP. >>> There have been lots of papers and research languages about typing problems >>> like >>> binary methods, null pointers etc., though, so taking the mainstream OO >>> languages >>> as the yardstick for OOP is jumping a little bit too short IMO. >>> >>> >>>> >>>>>> There's a reason Java can't >>>>>> express Comparable without losing static type-safety. >>>>> >>>>> You are certainly right that Java is not the best language out there >>>>> especially when talking about type systems (I often enough rant about >>>>> it :-) but I'm not sure what you mean here. Java's Comparable<T> seems >>>>> quite typesafe to me. Or do you mean that one could write `class A >>>>> implements Comparable<B>` by mistake? That's certainly a weak point >>>>> but doesn't compromise type safety, does it? >>>> >>>> Java has cleverly avoided compromising type safety here by failing to >>>> express the constraint that comparable conformance means a type can be >>>> compared to itself ;-) >>> >>> Indeed :-) >>> >>> >>>> >>>>> Ceylon has an elegant solution for that without using Self types: >>>>> >>>>> interface Comparable<in Other> of Other given Other satisfies >>>>> Comparable<Other> {...} >>>>> >>>>> Note the variance annotation (which Swift currently has not) and the >>>>> `of` which ensures that the only subtype of Comparable<T> is T. This >>>>> is a nice feature that I haven't seen often in programming languages >>>>> (only Cecil comes to mind IIRC) and which is used for enumerations as >>>>> well in Ceylon. In Swift I cannot do this but can use Self which >>>>> solves this problem differently, albeit with some drawbacks compared >>>>> to Ceylon's solution (having to redefine the compare method in all >>>>> subtypes, >>>> >>>> That sounds interesting but is a bit vague. A concise example of how >>>> this plays out in Swift and in Ceylon would be instructive here. >>> >>> Sorry, the difficulty with Self I was thinking of only occurs when Self is >>> in a covariant position >>> which is not the case in Comparable, of course. Let’s take a modified >>> example instead with Self >>> in a covariant position: >>> >>> Swift: >>> >>> protocol Minimizable { >>> func min(from other: Self) -> Self >>> } >>> >>> final class A : Minimizable { // has to be final >>> >>> let x: Int >>> >>> init(x: Int) { >>> self.x = x >>> } >>> >>> func min(from other: A) -> A { >>> return x < other.x ? self : other >>> } >>> } >>> >>> Ceylon: >>> >>> interface Minimizable<Other> of Other given Other satisfies >>> Minimizable<Other> { >>> shared formal Other min(Other other); >>> } >>> >>> class A() satisfies Minimizable<A> { >>> >>> Integer x = 0; >>> >>> shared actual default A min(A other) { >>> if (x < other.x) { >>> return this; >>> } else { >>> return other; >>> } >>> } >>> } >>> >>> In Ceylon class A does not have to be final and choosing the minimum of two >>> values would be available for values from the whole subtree of types rooted >>> in A (the `of` ensures that such a declaration cannot „cross“ into other >>> subtrees) whereas `Self` enforces that there is no subtree below class A. >>> >>> I have to admit that I am not well versed using `Self`, yet, so maybe I’m >>> wrong here. In addition I am sure that `Self` allows designs >>> that are not possible with Ceylon’s `of`. >>> >>> The usage of Ceylon’s `of` for enumeration types is as follows (example >>> taken from http://ceylon-lang.org/documentation/tour/types/): >>> >>> abstract class Node() of Leaf | Branch {} >>> >>> class Leaf(shared Object element) >>> extends Node() {} >>> >>> class Branch(shared Node left, shared Node right) >>> extends Node() {} >>> void printTree(Node node) { >>> switch (node) >>> case (is Leaf) { >>> print("Found a leaf: ``node.element``!"); >>> } >>> case (is Branch) { >>> printTree(node.left); >>> printTree(node.right); >>> } >>> } >>> >>> >>> >>>> >>>>> which has lead to lengthy discussion threads about Self, StaticSelf, >>>>> #Self etc.). >>>>> >>>>>> Finally, in a >>>>>> language with first-class value types, taking a protocol-oriented >>>>>> approach to abstraction leads to *fundamentally* different designs from >>>>>> what you get using OOP. >>>>> >>>>> Eiffel has expanded types which are value types with copy semantics >>>>> quite like structs in Swift. These expanded types are pretty much >>>>> integrated into Eiffel's class-only type system. Just define a class >>>>> as `expanded` and you are done. >>>> >>>> Unless this part of the language has changed since 1996, or unless I've >>>> misread https://www.cs.kent.ac.uk/pubs/1996/798/content.pdf, you can't >>>> make an efficient array with value semantics in Eiffel. That, IMO, >>>> cannot be considered a language with first-class value types. >>> >>> I haven’t had time yet to really evaluate that paper, but if you are right, >>> then I agree >>> with you that Eiffel cannot be considered as having first-calss value types. >>> >>> At least one of the deficiencies listed in the paper does not exist anymore >>> AFAIU >>> (expanded types not having constructors), though, so maybe things actually >>> do have >>> changed since then. >>> >>> >>>> >>>>> Eiffel seems to have no need to introduce interfaces or protocols to >>>>> the language to support value types. >>>> >>>> No, of course not. By saying that everything from abstract interfaces >>>> to static constraints and even value types is to be expressed a kind of >>>> possibly-generic class, you can eliminate distinctions in the language >>>> that IMO help to clarify design intent. This is a language design >>>> choice one could make, but not one I'd want to. In LISP, everything is >>>> an S-expression. That has certain upsides, but for me it fails the >>>> expressivity test. >>> >>> That’s certainly a valid point. >>> >>> Furthermore I do understand (and fully support) that being interoperable >>> with Objective-C is an >>> important restriction on Swift’s design space and I think it is absolutely >>> awesome how >>> that has been achieved! >>> >>> >>>> >>>>> You can even derive from expanded classes which is currently not >>>>> possible in Swift but has already been discussed several times on this >>>>> mailing list. Polymorphic usage is only possible for non expanded >>>>> super types, which means as far as I understood that a reference is >>>>> used in that case. Variables with an expanded type do not use refences >>>>> and therefore may not be used polymorphically in Eiffel. This should >>>>> be similar in Swift, at least as far as I did understand it. The >>>>> question whether variables with a value type can be used >>>>> polymorphically currently does not arise in Swift as structs cannot >>>>> inherit from each other (yet?). >>>>> >>>>>> >>>>>>> The more important distinction of Swift is emphasizing value types and >>>>>>> making mutation safely available by enforcing copy semantics for value >>>>>>> types. >>>>>> >>>>>> We don't, in fact, enforce copy semantics for value types. That's >>>>>> something I'd like to change. But regardless, value types would be a >>>>>> *lot* less useful if they couldn't conform to protocols, and so they >>>>>> would be a lot less used. Heck, before we got protocol extensions in >>>>>> Swift 2, there was basically *no way* to share implementation among >>>>>> value types. So you can't take protocols out of the picture without >>>>>> making value types, and the argument for value semantics, far weaker. >>>>> >>>>> Why? Like I said, Eiffel *has* value types without needing >>>>> protocols. They just have a unified mechanism built around classes. >>>> >>>> Because I'm speaking about Swift, not some other world where Protocol == >>>> Generic Class ;-) >>> >>> Ah, ok, I took your statement of protocols being needed for strong value >>> semantics >>> to be of general validity, not confined to Swift :-) >>> Within Swift that is certainly true! >>> >>> -Thorsten >>> >>> >>> _______________________________________________ >>> 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