<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body>
<div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto">I think there is a bit of confusion here as to what code synthesis does — synthesized conformances (whether <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Equatable</code>, <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Hashable</code>, or <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Codable</code>) merely provide default implementations for something which <em>already</em> conforms to one of these protocols; they do not <em>add</em> conformance to types on your behalf.</p>

<pre style="background-color:#F7F7F7; border-radius:5px 5px 5px 5px; margin-left:15px; margin-right:15px; max-width:90vw; overflow-x:auto; padding:5px; color:black" bgcolor="#F7F7F7"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0" bgcolor="#F7F7F7"><span style="color: #008800; font-weight: bold">struct</span> <span style="color: #BB0066; font-weight: bold">X</span> {
    <span style="color: #008800; font-weight: bold">let</span> <span style="color: #996633">val</span>: <span style="color: #007020">Int</span>
}
</code></pre>



<p dir="auto">under synthesized <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Equatable</code> does <em>not</em> get an <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">==</code> defined for it in the same way that it does not get <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">encode(to:)</code> or <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">init(from:)</code>. Since it does not conform to the <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Equatable</code> (or <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Codable</code>) protocol, no synthesis happens for it.</p>

<p dir="auto">As opposed to</p>

<pre style="background-color:#F7F7F7; border-radius:5px 5px 5px 5px; margin-left:15px; margin-right:15px; max-width:90vw; overflow-x:auto; padding:5px; color:black" bgcolor="#F7F7F7"><code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0" bgcolor="#F7F7F7"><span style="color: #008800; font-weight: bold">struct</span> <span style="color: #BB0066; font-weight: bold">Y</span> : <span style="color: #007020">Equatable</span> {
    <span style="color: #008800; font-weight: bold">let</span> <span style="color: #996633">val</span>: <span style="color: #007020">Int</span>
}
</code></pre>



<p dir="auto">which would get a default implementation for <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">static func ==(…)</code>, which it would otherwise already have to implement, by definition.</p>

<p dir="auto">Synthesis does not add methods on your behalf; it only gives implementations for methods you’d have to implement, no matter what. I don’t know what’s going on in your case, but it’s not caused by synthesis — if your type conforms to <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Equatable</code>, either you would have to define <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">==</code> yourself, or you’d get a free one. You’d see ambiguity regardless, since you asked for the type to be <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">Equatable</code> (or inherited that requirement).</p>

<p dir="auto">On 7 Sep 2017, at 10:32, Gwendal Roué via swift-evolution wrote:</p>

</div>
<div style="white-space:normal"></div>
<blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px"><div id="3062C267-6134-40A0-A54F-BAEC0154B8BE"><div 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="">Le 7 sept. 2017 à 14:37, Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I don't understand what this has to do with synthesized Equatable. &nbsp;Wouldn't manually implemented Equatable have the same impact? &nbsp;The design of a DSL should be able to accommodate conformance to basic protocols without ambiguity.</span></div></blockquote></div><div class=""><br class=""></div>I'll explain you:<div class=""><br class=""><div class="">The problem with synthesized Equatable is that it adds an unwanted == operator that returns a Bool.</div><div class=""><br class=""></div><div class="">This operator is unwanted because it conflicts with the == operator defined by the DSL which does not return a Bool.</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>// Without synthesised Equatable</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let r = (a == b) // the type defined by the DSL</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>// With synthesised Equatable</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let r = (a == b) // ambiguous</div><div class=""><br class=""></div><div class="">This is the same kind of conflict that happen when a function is overloaded with two return types:</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>func f() -&gt; Int { ... }</div><div class=""><div class=""><span class="Apple-tab-span" style="white-space: pre;">        </span>func f() -&gt; String { ... }</div></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>f() // ambiguous</div><div class=""><br class=""></div><div class="">Without the synthesized Equatable, the type would not have any == operator that returns a Bool, and thus no conflict with the == operator defined by the DSL (the one that returns an SQL expression, in our particular context).</div><div class=""><br class=""></div><div class="">I hope that I have explained how synthesized conformance may impact code by the mere fact that they define methods. I'm not talking about the correctness of the synthesized code. I'm talking about its mere existence.</div><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">We generally want as many types to be Equatable and Hashable as possible. &nbsp;Synthesized conformance means more types will have these conformance and that's a good thing in all cases (so long as the implementation is correct). &nbsp;</div></blockquote><div><br class=""></div>Sure, of course. I'm with you. I'm not talking against code synthesis. Again, I'm not talking about the correctness either.</div><div><br class=""></div><div>I'm talking about the consequences of implicit and non-avoidable synthesis. Exactly the theme of this thread, unless I'm totally mistaken.</div><div><div class=""><div class=""><br class=""></div></div></div></div><div class="">Gwendal Roué</div></div><div class=""><br class=""></div></div></div></blockquote>
<div style="white-space:normal">
<blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px">
</blockquote><blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px"><p dir="auto">_______________________________________________<br>
swift-evolution mailing list<br>
swift-evolution@swift.org<br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="color:#777">https://lists.swift.org/mailman/listinfo/swift-evolution</a></p>
</blockquote></div>
<div style="white-space:normal">
</div>
</div>
</body>
</html>