<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>Good point. :) </p>

<p>I’ve been thinking if there is a way to still have a shiny and swifty looking syntax which would solve this problem:</p>

<pre><code class="swift">typealias SomeExistential&lt;T&gt; = existential&lt;T&gt; {

    constraint UIView
    constraint ProtocolA     
    constraint ProtocolB.AssociatedType == T
     
    var someVar: Int { get set }
}
</code></pre>

<p>This mimics <code>typealias Name = protocol&lt;…&gt;</code> where the <code>protocol&lt;…&gt;</code> does not have an explicit name.</p>

<p>One downside of this approach:</p>

<ul>
<li>To use such an existential you would need give it a name trough <code>typealias</code>.</li>
</ul>

<pre><code class="swift">typealias AnyCollection&lt;T&gt; = existential&lt;T&gt; {

   constraint Collection
   constraint Collection.Element == T
}
</code></pre>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1464528352254468864" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 26. Mai 2016 bei 22:56:10, Matthew Johnson (<a href="mailto:matthew@anandabits.com">matthew@anandabits.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div></div><div>



<title></title>


<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On May 26, 2016, at 3:39 PM, Adrian Zubarev via
swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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; margin: 0px;" class="">
<div class="">
<blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; font-style: 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;">
<div dir="auto" style="zoom: 1;" class="">
<div class="bloop_container">
<div class="bloop_frame">
<blockquote type="cite" style="font-family: 'helvetica Neue', helvetica;" class="">
<div dir="ltr" class="">I alway enjoy hearing your ideas.
<div class=""><br class=""></div>
<div class="">This is quite interesting. It's basically a way to
define an ad-hoc interface that a type doesn't need to explicitly
declare it conforms to. I know Golang works similarly; if a Go type
implements all the requirements of an interface it conforms
automatically.</div>
</div>
</blockquote>
<blockquote type="cite" style="font-family: 'helvetica Neue', helvetica;" class="">
<div dir="ltr" class="">
<div class=""><br class=""></div>
<div class="">There are positives and negatives to allowing this
sort of ad-hoc interface.</div>
</div>
</blockquote>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
<br class=""></div>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
Agree. &nbsp;It would definitely make the language "feel" a bit
more fluid. &nbsp;But it doesn't add any expressive power and could
have undesirable consequences.</div>
<br style="font-family: 'helvetica Neue', helvetica;" class="">
<blockquote type="cite" style="font-family: 'helvetica Neue', helvetica;" class="">
<div dir="ltr" class="">This would make for a good standalone
proposal -- both because it's complex enough to deserve its own
discussion, and because if the community is interested someone
would have to work through all the implications in order to put
together a proposal. It would be quite a big change.</div>
</blockquote>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
<br class=""></div>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
<span style="background-color: rgba(255, 255, 255, 0);" class="">I
don't see how this is different from a protocol other than the lack
of requirement to declare conformance explicitly. &nbsp;The need to
explicitly declare conformance is a design decision that I believe
the core team feels pretty strongly about. &nbsp;</span></div>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
<span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div>
<div style="font-family: 'helvetica Neue', helvetica;" class="">
<span style="background-color: rgba(255, 255, 255, 0);" class="">That said, it hasn't been debated by the community yet so if
someone feels strongly about dropping explicit conformance
declarations it might be worth pitching the idea, if for not other
reason than to have a discussion about it on the lost.</span></div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="">I don’t see any desire to follow Go’s path here and
drop explicit conformance in any way.</p>
<p class="">Basically such `existential` mechanism could express
more than `Any&lt;…&gt;` could. That said I do feel that this
"could“ have some potential to exist alongside `Any&lt;…&gt;`.</p>
<div class=""><br class=""></div>
</div>
</div>
</blockquote>
<div><br class=""></div>
Anything “more” it could express would be specific member
requirements, which would make it in some sense ad-hoc protocol.
&nbsp;I would rather see one mechanism for defining member
requirements. &nbsp;We already have that and it is called a
protocol.</div>
<div><br class=""></div>
<div>The reason types won’t need to declare explicit conformance to
an `Any` is that the requirements of the `Any` are composed of an
optional supertype as well zero or more protocol and associated
type constraints. &nbsp;The “conformance" of a type to the `Any` is
defined by its conformance to the protocols that the `Any` is
composed of. &nbsp;</div>
<div><br class=""></div>
<div>If you want to introduce new requirements the right way to do
it is to declare an additional protocol and add it to the list of
protocol constraints in the `Any`.<br class="">
<blockquote type="cite" class="">
<div class="">
<div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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; margin: 0px;" class="">
<p class="">From my understanding of this whole existential type
thing is that it can be used both ways, explicitly and implicitly.
As said before we only discussed the explicit existential
types.</p>
<p class=""><br class=""></p>
<p class="">Just another pseudo example:</p>
<p class="">```swift</p>
<p class="">// this could also replace typealiases for (generic)
existentials</p>
<div class=""><br class=""></div>
</div>
</div>
</blockquote>
<div><br class=""></div>
I gave some consideration to scoped syntax like this a few days
ago. &nbsp;The problem with it is that `Any` is a structural type
defined by the constraints and this makes it look like a nominal
type. &nbsp;</div>
<div><br class=""></div>
<div>If you define two “existential” types with the exact same
constraints under different names, what happens? &nbsp;They should
be identical to other any equivalent formulation and that is clear
under Austin’s proposal, but because this alternative looks like a
nominal type you might have the expectation that the types are
independent of each other. &nbsp;That is why typealias is the
correct solution here IMO. &nbsp;It is clear that the name is just
an alias for a structural type.</div>
<div>
<blockquote type="cite" class="">
<div class="">
<div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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; margin: 0px;" class="">
<p class="">existential CrazyView &nbsp;{</p>
<p class="">&nbsp; &nbsp; // we could introduce a way for
constraints which could have a nice looking syntax</p>
<p class="">&nbsp; &nbsp; // break `Any&lt;…&gt;` nesting and long
very long composition lines of `Any&lt;…&gt;`&nbsp;</p>
<p class="">&nbsp; &nbsp; constraint Any&lt;UIScrollView,
Any&lt;UITableView, Any&lt;UIView, ProtocolA&gt;&gt;&gt;</p>
<p class="">&nbsp; &nbsp; constraint ProtocolA.AssociatedType ==
Int&nbsp;</p>
<p class="">&nbsp; &nbsp; func crazyFunction()</p>
<p class="">}</p>
<p class=""><br class=""></p>
<p class="">existential AnyCollection&lt;T&gt; &nbsp;{</p>
<p class="">&nbsp; &nbsp;constraint Collection</p>
<p class="">&nbsp; &nbsp;constraint Collection.Element == T</p>
<p class="">}</p>
<p class="">```</p>
<div class="">But I don’t want to go any further if there is no
need (yet).</div>
</div>
<br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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 id="bloop_sign_1464293870604892928" class="bloop_sign" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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;">
<div style="font-family: helvetica, arial; font-size: 13px;" class="">--&nbsp;<br class="">
Adrian Zubarev<br class="">
Sent with Airmail</div>
</div>
<br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">
<span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">
<span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">
<a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">swift-evolution@swift.org</a><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant: 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="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div>
</blockquote>
</div>
<br class="">


</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>