<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">On Tue, Dec 31, 2019 at 5:12 PM Pierre Fenoll <<a href="mailto:pierrefenoll@gmail.com">pierrefenoll@gmail.com</a>> wrote:</span><br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Thoughts?<br></div><div><br></div></div></div></div></blockquote><div><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Admitting equality and by extension unification on function values is a dangerous game which you usually don't want to play. The reason is that equality often has to be tailored to the situation.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Stake #1 in the vampire: Function equality is undecidable[0]. We can't generally handle this:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">F = fun(X) -> X + 3 end,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">G = fun(X) -> X + 2 + 1 end,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">F==G.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">though an optimizing compiler might decide to turn G into the exact same byte code instructions as F.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Stake #2 in the vampire: reference equality is not very Erlang-like, but it gives you *some* equality over the function domain. We tend to test equality by value only.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Stake #3 in the vampire: sensible languages outright *reject* equality on certain types. And by extension, not all types can be compared in the usual sense.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Stake #4 in the vampire: you often want to equip several different types of equality to a type[1]</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">[0] Sketch of proof: reduce to a solution to the halting problem. Also see Rice's theorem.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">[1] Classic Haskell98 has a couple of weaknesses here. If you implement Eq, then you cannot easily implement another kind of Eq for the same type unless you newtype-wrap it. It is also prevalent in the Ord class with orders.</div></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">J.</div></div>