<div dir="ltr"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">As part of a project to formalize the theory of overlapping instances,<br>

I&#39;m looking for examples of overlapping and incoherent instances and<br>
their usage.</blockquote><div><br>EMGM [1] uses overlapping instances to make it more convenient to use extensible, generic functions on arbitrary datatypes. They&#39;re not absolutely necessary, but they save on (a potentially large amount of) boilerplate code.<br>
<br>For example, we have a generic show function [2], but without extension it would evaluate a list value as:<br><br><span style="font-family: courier new,monospace;">&gt; show [1,2,3 :: Int]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&quot;1:2:3:[]</span>&quot;<br style="font-family: courier new,monospace;"><br>We want to print a list with the traditional Haskell syntax, so we need to extend &#39;show&#39; with a special case. Without overlapping instances, we would do it like this:<br>
<br><span style="font-family: courier new,monospace;">&gt; class (Generic g) =&gt; GenericList g where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt;&nbsp;&nbsp; rlist :: g a </span><span style="font-family: courier new,monospace;">-&gt; g [a]<br>
&gt;&nbsp;&nbsp; </span><span style="font-family: courier new,monospace;">rlist = rList </span><br style="font-family: courier new,monospace;"><br>(where &#39;rList&#39; is the list representation [3])<br><br><span style="font-family: courier new,monospace;">&gt; instance GenericList Show where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt;&nbsp;&nbsp; rlist = specialListShow</span><br style="font-family: courier new,monospace;"><br>(where &#39;specialListShow&#39; is our specialization)<br><br><span style="font-family: courier new,monospace;">&gt; instance (GenericList g, Rep g a) =&gt; Rep g [a] where </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt;&nbsp;&nbsp; rep = rlist rep</span><br style="font-family: courier new,monospace;"><br>(where &#39;Rep g a&#39; is the type class dispatcher for representations and &#39;rep&#39; is the value that determines that representation)<br>
<br>The problem with the above is that if one potentially wants to write an ad-hoc case for any datatype/function pair, then we need to have a class like &#39;GenericList&#39; for every datatype. Then, we can write an instance of &#39;GenericList&#39; for that function (e.g. &#39;show&#39;). However, even if we don&#39;t want a special case, we still need that instance. Supposing we wanted to use &#39;show&#39; as is for lists in our program, then we need a instance with defaults.<br>
<br><span style="font-family: courier new,monospace;">&gt; instance GenericList Show</span><br style="font-family: courier new,monospace;"><br>It&#39;s not very convenient to use generic functions if one must keep declaring instances for every datatype and function combination that one uses. Overlapping instances to the rescue!<br>
<br>With overlapping instances enabled, we remove the &#39;GenericList&#39; class and instance from above and change the &#39;Rep&#39; instance to use &#39;Generic&#39; (our &quot;base&quot; class) instead of &#39;GenericList&#39;.<br>
<br><span style="font-family: courier new,monospace;">&gt; instance (Generic g, Rep g a) Rep g (List a) where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt;&nbsp;&nbsp; rep = rlist rep</span><br style="font-family: courier new,monospace;">
<br>Then, nothing else needs to be done to use &#39;show&#39; on any datatype supported by EMGM or with support added by the user. If one still wants to define an ad-hoc case for lists, it&#39;s just as simple.<br><br><span style="font-family: courier new,monospace;">&gt; instance (Rep Show a) =&gt; Rep Show (List a) where </span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&gt; &nbsp; rep = </span><span style="font-family: courier new,monospace;">specialListShow rep</span><br style="font-family: courier new,monospace;"><br>I would point you to our lecture notes for the Advanced Functional Programming Summer School that give a better explanation, but they&#39;re not quite done. Let me know if you want more information off-list.<br>
<br>Regards,<br>Sean<br><br>[1] <a href="http://www.cs.uu.nl/wiki/GenericProgramming/EMGM">http://www.cs.uu.nl/wiki/GenericProgramming/EMGM</a> <br></div></div>[2] <a href="https://svn.cs.uu.nl:12443/viewvc/dgp-haskell/EMGM/src/Generics/EMGM/Functions/Show.hs?view=markup">https://svn.cs.uu.nl:12443/viewvc/dgp-haskell/EMGM/src/Generics/EMGM/Functions/Show.hs?view=markup</a><br>
[3] <a href="https://svn.cs.uu.nl:12443/viewvc/dgp-haskell/EMGM/src/Generics/EMGM/Data/List.hs?view=markup">https://svn.cs.uu.nl:12443/viewvc/dgp-haskell/EMGM/src/Generics/EMGM/Data/List.hs?view=markup</a><br></div>