<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 29, 2017, at 2:01 PM, Xiaodi Wu <<a href="mailto:xiaodi.wu@gmail.com" class="">xiaodi.wu@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">On Sun, Jan 29, 2017 at 1:37 PM, Matthew Johnson<span class="Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:matthew@anandabits.com" target="_blank" class="">matthew@anandabits.com</a>></span><span class="Apple-converted-space"> </span>wrote:<br class=""><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div dir="auto" class=""><div class=""><br class=""><br class="">Sent from my iPad</div><span class="gmail-"><div class=""><br class="">On Jan 29, 2017, at 12:58 PM, Xiaodi Wu via swift-evolution <<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class="">Cool. Another avenue of improvement here is relaxing the single-class spelling rule for the sake of composing typealiases.<br class=""><br class="">As Matthew mentioned, if I have class Base and typealiases Foo = Base & Protocol1 and Bar = Base & Protocol2, it'd be nice to allow Foo & Bar.<br class=""><br class="">It'd be nice to go one step further: given class Derived : Base, if I have typealiases Foo2 = Base & Protocol1 and Bar2 = Derived & Protocol2, then it could be permitted to write Foo2 & Bar2, since there is effectively only one subclass requirement (Derived).<br class=""><br class="">As I understand it, the rationale for allowing only one subclass requirement is that Swift supports only single inheritance. Thus, two disparate subclass requirements Base1 & Base2 would make your existential type essentially equivalent to Never. But Base1 & Base1 & Base1 is fine for the type system, the implementation burden (though greater) shouldn't be too awful, and you would measurably improve composition of typealiases.<br class=""></div></blockquote><div class=""><br class=""></div></span><div class="">Yes, this is what I was indicating in my post as well.</div><div class=""><br class=""></div><div class="">Are you suggesting that Base1 & Base2 compose to a type that is treated identically to Never do you think it should be an immediate compiler error? I remember having some discussion about this last year and think somebody came up with a very interesting example of where the former might be useful.</div></div></blockquote><div class=""><br class=""></div><div class="">Last year's discussion totally eludes me for some reason. But sure, if deferring the error until runtime is actually useful then why not? In the absence of an interesting use case, though, I think it'd be nice for the compiler to warn you that Base1 & Base2 is not going to be what you want.</div></div></div></div></div></blockquote><div><br class=""></div><div>Deferring to runtime isn’t what I mean. If you try to actually *do* anything that requires an instance of `Base1 & Based` (which you almost always would) you would still get a compile time error.</div><div><br class=""></div><div>I managed to dig up the example from last year’s thread and it is definitely a good one:</div><div><br class=""></div><div>func intersection<T, U>(ts; Set<T>, us: Set<U>) -> Set<T & U></div><div><br class=""></div><div>The desire is that we are always able to produce a result set. When T & U is uninhabitable it will simply be an empty set just like Set<Never> has a single value which is the empty set. </div><div><br class=""></div><div>This example points even more strongly in the direction of allowing *any* concrete type to be used, not just classes - even today we could produce uninhabitable existentials like this using value types.</div><div><br class=""></div><div>Here’s the link to the thread: <a href="https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160523/019463.html" class="">https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160523/019463.html</a></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""><br class=""></div><div class=""><br class=""></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div dir="auto" class=""><span class="gmail-"><blockquote type="cite" class=""><div class=""><div class="gmail_quote"><div dir="ltr" class="">On Sun, Jan 29, 2017 at 12:41 Austin Zheng <<a href="mailto:austinzheng@gmail.com" target="_blank" class="">austinzheng@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;">The "class comes first" requirement made more sense when the proposed syntax was still "Any<T, U, V>", intentionally mirroring how the superclass and conformances are declared on a class declaration (the archives contain more detailed arguments, both pro and con). Now that the syntax is "T & U & V", I agree that privileging the class requirement is counterintuitive and probably unhelpful.<br class="gmail-m_-1279302232438251699gmail_msg"><br class="gmail-m_-1279302232438251699gmail_msg">Austin<br class="gmail-m_-1279302232438251699gmail_msg"><br class="gmail-m_-1279302232438251699gmail_msg">> On Jan 29, 2017, at 10:37 AM, Matt Whiteside via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="gmail-m_-1279302232438251699gmail_msg" target="_blank">swift-evolution@swift.org</a>> wrote:<br class="gmail-m_-1279302232438251699gmail_msg">><br class="gmail-m_-1279302232438251699gmail_msg">> Thanks for writing this proposal David.<br class="gmail-m_-1279302232438251699gmail_msg">><br class="gmail-m_-1279302232438251699gmail_msg">>> On Jan 29, 2017, at 10:13, Xiaodi Wu via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="gmail-m_-1279302232438251699gmail_msg" target="_blank">swift-evolution@swift.org</a>> wrote:<br class="gmail-m_-1279302232438251699gmail_msg">>><br class="gmail-m_-1279302232438251699gmail_msg">>> As Matthew mentioned, the rules can certainly later be relaxed, but given that this proposal has the compiler generating fix-its for subclasses in second position, is there a reason other than stylistic for demanding MyClass & MyProtocol instead of MyProtocol & MyClass?<br class="gmail-m_-1279302232438251699gmail_msg">>><br class="gmail-m_-1279302232438251699gmail_msg">>> From a naive perspective, it seems that if the compiler understands my meaning perfectly, it should just accept that spelling rather than complain.<br class="gmail-m_-1279302232438251699gmail_msg">><br class="gmail-m_-1279302232438251699gmail_msg">> I had that thought too. Since ‘and’ is a symmetric operation, requiring the class to be in the first position seems counter-intuitive.<br class="gmail-m_-1279302232438251699gmail_msg">><br class="gmail-m_-1279302232438251699gmail_msg">> -Matt<br class="gmail-m_-1279302232438251699gmail_msg">><br class="gmail-m_-1279302232438251699gmail_msg">> ______________________________<wbr class="">_________________<br class="gmail-m_-1279302232438251699gmail_msg">> swift-evolution mailing list<br class="gmail-m_-1279302232438251699gmail_msg">><span class="Apple-converted-space"> </span><a href="mailto:swift-evolution@swift.org" class="gmail-m_-1279302232438251699gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail-m_-1279302232438251699gmail_msg">><span class="Apple-converted-space"> </span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail-m_-1279302232438251699gmail_msg" target="_blank">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a><br class="gmail-m_-1279302232438251699gmail_msg"><br class="gmail-m_-1279302232438251699gmail_msg"></blockquote></div></div></blockquote><blockquote type="cite" class=""><div class=""><span class="">______________________________<wbr class="">_________________</span><br class=""><span class="">swift-evolution mailing list</span><br class=""><span class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a></span></div></blockquote></span></div></blockquote></div></div></div></div></blockquote></div><br class=""></body></html>