<div dir="ltr">Pardon my ignorance here, but shouldn’t `foo&lt;T: Protocol&gt;(t: T)` always monomorphize due to being generic? Isn’t that how `T: …` differs from, say `foo(t: Protocol)`?</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 14, 2017 at 7:30 PM, Joe Groff <span dir="ltr">&lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Mar 14, 2017, at 11:27 AM, David Hart &lt;<a href="mailto:david@hartbit.com">david@hartbit.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;&gt; On 14 Mar 2017, at 16:41, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;&gt; On Mar 13, 2017, at 8:38 AM, Vincent Esche via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Source compatibility<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Making use of &quot;extending protocols to conform to protocols&quot;:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; extension Hashable: HashVisitable<br>
&gt;&gt;&gt; {<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; func hash&lt;H: Hasher&gt;(_ hasher: inout<br>
&gt;&gt;&gt; H) {<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; self.hashValue.hash(&amp;<br>
&gt;&gt;&gt; hasher)<br>
&gt;&gt;&gt;   }<br>
&gt;&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; We&#39;re unlikely to add this feature soon. It seems reasonable to me to instead have `HashVisitable` refine `Hashable` and provide a default implementation of `hashValue` using a default hasher. I think we still want `Hashable` to be the currency protocol most APIs work with for performance in unspecialized code, since we could inline the visitation and hasher implementation together inside the specialized `hashValue` witness.<br>
&gt;<br>
&gt; Can you explain the performance argument? How does it fare (in your opinion) compared to the arguments in the proposal?<br>
&gt;<br>
&gt; How about:<br>
&gt;<br>
&gt; protocol Hashable {<br>
&gt;    func hash&lt;H: Hasher&gt;(with hasher: inout H)<br>
&gt; }<br>
&gt;<br>
&gt; extension Hashable {<br>
&gt;    var hashValue: Int {<br>
&gt;        var hasher = StdLibDefaultHasher()<br>
&gt;        hash(with: hasher)<br>
&gt;        return hash.finish()<br>
&gt;    }<br>
&gt; }<br>
<br>
</span>For unspecialized code that takes a generic T: Hashable, that will place the only dynamic dispatch point on `hash`, so that will place an abstraction barrier between the Hasher and Self type being hashed, so would likely mean a dynamic call for every component of the value being hashed. Having `hashValue` be a dynamic dispatch point allows the hasher to be inlined together with the type&#39;s visitor implementation.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Joe<br>
</font></span></blockquote></div><br></div>