<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:9.0pt;
        font-family:"Courier New";
        mso-fareast-language:EN-US;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        mso-style-link:"Code Char";
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Courier New";
        color:#1F497D;
        mso-fareast-language:EN-US;}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:"Courier New";
        color:#1F497D;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Courier New";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
.MsoPapDefault
        {mso-style-type:export-only;
        margin-top:6.0pt;
        margin-right:0cm;
        margin-bottom:6.0pt;
        margin-left:0cm;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 106.15pt 72.0pt 106.15pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1647784598;
        mso-list-type:hybrid;
        mso-list-template-ids:-849163600 134807553 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l0:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l0:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l0:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1
        {mso-list-id:1796364353;
        mso-list-type:hybrid;
        mso-list-template-ids:134927520 1366347736 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l1:level1
        {mso-level-start-at:0;
        mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;
        mso-fareast-font-family:"Times New Roman";
        mso-bidi-font-family:"Courier New";}
@list l1:level2
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level3
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level4
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level5
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level6
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
@list l1:level7
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Symbol;}
@list l1:level8
        {mso-level-number-format:bullet;
        mso-level-text:o;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:"Courier New";}
@list l1:level9
        {mso-level-number-format:bullet;
        mso-level-text:\F0A7;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        font-family:Wingdings;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText">Sergei<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I finally found time to look into what is happening here.  It’s a good illustration of the dangers of overlapping instances.  Here is the setup:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">* Module ResEuc_<o:p></o:p></p>
<p class="MsoPlainText">  * Contains<o:p></o:p></p>
<p class="MsoPlainText">        instance (...)                    => Ring  (ResidueE a)  <---- (A)<o:p></o:p></p>
<p class="MsoPlainText">        instance (..., Ring (ResidueE a)) => Field (ResidueE a)  <---- (B)<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">* Module PFact__<o:p></o:p></p>
<p class="MsoPlainText">  * Imports Pgcd_, which imports ResEuc_<o:p></o:p></p>
<p class="MsoPlainText">  * Contains code that needs<o:p></o:p></p>
<p class="MsoPlainText">       (Field (ResidueE (UPol (ResidueE Integer))))      <------ (X)<o:p></o:p></p>
<p class="MsoPlainText">  * To solve (X) we use instance (B) from ResEuc_<o:p></o:p></p>
<p class="MsoPlainText">  * And hence we need to solve (Ring (ResidueE (UPol (ResidueE Integer))))<o:p></o:p></p>
<p class="MsoPlainText">    which we do using (A) but not (C)            <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">* Module RsePol_<o:p></o:p></p>
<p class="MsoPlainText">  * Imports PFact__<o:p></o:p></p>
<p class="MsoPlainText">  * Contains the specialised instance<o:p></o:p></p>
<p class="MsoPlainText">      instance (...) => Ring (ResidueE (UPol a))     <------ (C)<o:p></o:p></p>
<p class="MsoPlainText">    which overlaps instance (A)<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">* Module Main<o:p></o:p></p>
<p class="MsoPlainText">  * Needs an instance for<o:p></o:p></p>
<p class="MsoPlainText">       Field (ResidueE (UPol (Residue Integer)))      <------ (Y)<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">  * Although GHC *could* generate this by instance declarations,<o:p></o:p></p>
<p class="MsoPlainText">    which it would do using (B) and then using (C),<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">    instead GHC cleverly sees that it has generated it before,<o:p></o:p></p>
<p class="MsoPlainText">    in module PFact__, and so uses the one from PFact__. And<o:p></o:p></p>
<p class="MsoPlainText">    that is what gives rise to your error<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">So the real problem is that in PFact__, we make an instance (X) that does not see the specialised instance (C).  It *<b>cannot</b>* see that instance because RsePol_ imports PFact__.  So whatever code uses (X) is not going to see the
 specialised instance.  I bet that this is not what you intend. This may be a latent bug in DoCon.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I solved the problem by combining PFact__ and RsePol_ into a single module.  Then everything works fine.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">What are the general lessons here?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">
<![if !supportLists]><span style="font-family:Symbol"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]>GHC generally assumes that if it generates (C T) in one place, then it can use that anywhere in the program that (C T) is needed.  That is, there is only one (C T) dictionary.<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:36.0pt"><o:p> </o:p></p>
<p class="MsoPlainText" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2">
<![if !supportLists]><span style="font-family:Symbol"><span style="mso-list:Ignore">·<span style="font:7.0pt "Times New Roman"">       
</span></span></span><![endif]>But suppose you have overlapping instance in different modules; say<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:54.0pt">module A where instance C [a]<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:54.0pt">module B where import A; instance C [Maybe a]<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:35.45pt">If you use (C [Maybe Int]) in A, then of course we won’t see the instance in B.  So you’ll get a different dictionary than if you compute C [Maybe Int] in module B.<o:p></o:p></p>
<p class="MsoPlainText" style="margin-left:42.55pt"><o:p> </o:p></p>
<p class="MsoPlainText">In short, overlapping instances are OK, but it’s best to put them in the same module as the instances they overlap.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Could GHC behave as if all instances were calculated afresh in the module being compiled.  Yes, of course it could, but at the cost of losing the benefit of cross-module specialisation.  An overloaded function specialised at, say, [Int]
 in one module could not be re-used in another in case the instances changed.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Simon<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">-----Original Message-----</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">From: ghc-tickets [mailto:ghc-tickets-bounces@haskell.org] On Behalf Of</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">Sergei Meshveliani</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">Sent: 23 May 2015 22:08</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">To: glasgow-haskell-users@haskell.org</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">Cc: glasgow-haskell-bugs@haskell.org</span></p>
<p class="MsoPlainText">| <span lang="EN-US" style="mso-fareast-language:EN-GB">Subject: overlapping instances in 7.10.1</span></p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| Dear GHC developers,</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| This request overrides my previous one of  "7.10.1-err..."</p>
<p class="MsoPlainText">| (it is simpler and more precise).</p>
<p class="MsoPlainText">| The archive</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| <a href="http://www.botik.ru/pub/local/Mechveliani/ghcQuest/7.10.1-errReport-may23-2015.zip">
<span style="color:windowtext;text-decoration:none">http://www.botik.ru/pub/local/Mechveliani/ghcQuest/7.10.1-errReport-</span></a></p>
<p class="MsoPlainText"><a href="http://www.botik.ru/pub/local/Mechveliani/ghcQuest/7.10.1-errReport-may23-2015.zip"><span style="color:windowtext;text-decoration:none">| may23-2015.zip</span></a></p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| presents a question about  ghc-7.10.1.</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| Make it, please, with  ghc-7.10.1  by</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">|          ghc $doconCpOpt -O --make Main</p>
<p class="MsoPlainText">| ,</p>
<p class="MsoPlainText">| $doconCpOpt =</p>
<p class="MsoPlainText">|  -fwarn-unused-matches -fwarn-unused-binds -fwarn-unused-imports</p>
<p class="MsoPlainText">|  -fno-warn-overlapping-patterns -XRecordWildCards -XNamedFieldPuns</p>
<p class="MsoPlainText">|  -XFlexibleContexts -XMultiParamTypeClasses -XUndecidableInstances</p>
<p class="MsoPlainText">|  -XTypeSynonymInstances -XFlexibleInstances -fcontext-stack=30</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| as it is written there in  README.txt.</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| README.txt  explains which two instances are wrongly resolved</p>
<p class="MsoPlainText">| -- as I expect.</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| In  ghc-7.8.2  they are resolved in a correct way</p>
<p class="MsoPlainText">| (and there is a different pragma syntax).</p>
<p class="MsoPlainText">| I conclude this from running the test in  docon-2.12.</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| Am I missing something?</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| Please, advise,</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| ------</p>
<p class="MsoPlainText">| Sergei</p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| </p>
<p class="MsoPlainText">| _______________________________________________</p>
<p class="MsoPlainText">| ghc-tickets mailing list</p>
<p class="MsoPlainText">| <a href="mailto:ghc-tickets@haskell.org"><span style="color:windowtext;text-decoration:none">ghc-tickets@haskell.org</span></a></p>
<p class="MsoPlainText">| <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets">
<span style="color:windowtext;text-decoration:none">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-tickets</span></a></p>
</div>
</body>
</html>