<div class="gmail_quote">On Thu, Feb 19, 2009 at 7:09 AM, John A. De Goes <span dir="ltr">&lt;<a href="mailto:john@n-brain.net">john@n-brain.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="Ih2E3d"><br>
On Feb 14, 2009, at 2:29 PM, Luke Palmer wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
To me, typeclasses are at their best when you have a real abstraction to encode.<br>
</blockquote>
<br></div>
I agree.<div class="Ih2E3d"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
If you are having trouble using a typeclass and need C++-style ad-hoc overloading, it&#39;s likely you are trying to encode a &quot;fake&quot; abstraction -- one that has only linguistic, rather than mathematical meaning.<br>

</blockquote>
<br></div>
I don&#39;t think what you&#39;re calling a &quot;linguistic&quot; abstraction is &quot;fake&quot;.</blockquote><div><br></div><div>Please ignore the word &quot;fake&quot;. &nbsp;I don&#39;t want to get into any subjective arguments based on the connotation of that word.</div>
<div><br></div><div>What I mean to say is, the theory of typeclasses is good at encoding mathematical abstractions, and bad at encoding linguistic ones. &nbsp;Take that as you will, but I conjecture that trying to cram linguistic overloading into a typeclass is generally going to be painful.</div>
<div><br></div><div>A good rule of thumb is: are there any algorithms which work for an arbitrary member of this class? &nbsp;I certainly cannot see any for your flatten example.</div><div><br></div><div>I&#39;m not saying that linguistic overloading is a bad thing. You make good arguments for it, and I find it cleans up code sometimes. &nbsp;Typeclasses just aren&#39;t the right tool for it, and Haskell has no good tool for it.</div>
<div><br></div><div>In fact, I think it a very interesting research question to come up with a mechanism that supports linguistic overloading, and interacts with typeclasses and inference cleanly. &nbsp;The obvious solution (just look in your namespace for one that matches) has serious drawbacks, and nothing else is jumping to mind.</div>
</div>