<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=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
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.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:12.0pt;
        font-family:"Courier New";
        color:#1F497D;}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:"Courier New";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.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 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></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="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">I’m all for it.   Can advise.  (Make a ticket.)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Thanks!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Glasgow-haskell-users [mailto:glasgow-haskell-users-bounces@haskell.org]
<b>On Behalf Of </b>Evan Laforge<br>
<b>Sent:</b> 24 October 2015 03:48<br>
<b>To:</b> GHC users<br>
<b>Subject:</b> type error formatting<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Arial",sans-serif">Here's a typical simple type error from GHC:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Courier New""><o:p> </o:p></span></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Courier New"">Derive/Call/India/Pakhawaj.hs:142:62:</span><br>
<span style="font-family:"Courier New"">    Couldn't match type ‘Text’ with ‘(a1, Syllable)’</span><br>
<span style="font-family:"Courier New"">    Expected type: [([(a1, Syllable)], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">      Actual type: [([Syllable], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">    Relevant bindings include</span><br>
<span style="font-family:"Courier New"">      syllables :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:16)</span><br>
<span style="font-family:"Courier New"">      best_match :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">                    -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:5)</span><br>
<span style="font-family:"Courier New"">    In the second argument of ‘mapMaybe’, namely ‘all_bols’</span><br>
<span style="font-family:"Courier New"">    In the second argument of ‘($)’, namely</span><br>
<span style="font-family:"Courier New"">      ‘mapMaybe (match_bols syllables) all_bols’</span><br>
<br>
<span style="font-family:"Arial",sans-serif">I've been having more trouble than usual reading GHC's errors, and I finally spent some time to think about it.  The problem is that this new "relevant bindings include" section gets in between the expected and actual
 types (I still don't like that wording but I've gotten used to it), which is the most critical part, and the location context, which is second most critical.  Notice the same effect in the previous sentence :)  After I see a type error the next thing I want
 to see is the where it happened, so I have to skip over the bindings, which can be long and complicated.  Then I usually know what to do, and only look into the bindings if something more complicated is going on, like wonky inference.  So how about reordering
 the message:</span><br>
<br>
<span style="font-family:"Courier New"">Derive/Call/India/Pakhawaj.hs:142:62:</span><br>
<span style="font-family:"Courier New"">    Couldn't match type ‘Text’ with ‘(a1, Syllable)’</span><br>
<span style="font-family:"Courier New"">    Expected type: [([(a1, Syllable)], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">      Actual type: [([Syllable], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">    In the second argument of ‘mapMaybe’, namely ‘all_bols’</span><br>
<span style="font-family:"Courier New"">    In the second argument of ‘($)’, namely</span><br>
<span style="font-family:"Courier New"">      ‘mapMaybe (match_bols syllables) all_bols’</span><br>
<span style="font-family:"Courier New"">    Relevant bindings include</span><br>
<span style="font-family:"Courier New"">      syllables :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:16)</span><br>
<span style="font-family:"Courier New"">      best_match :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">                    -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:5)</span><br>
<br>
<span style="font-family:"Arial",sans-serif">After this, why not go one step further and set off the various sections visibly to make it easier to scan.  The context section can also be really long if it gets an entire do block or record:</span><br>
<br>
<span style="font-family:"Courier New"">Derive/Call/India/Pakhawaj.hs:142:62:</span><br>
<span style="font-family:"Courier New"">  * Couldn't match type ‘Text’ with ‘(a1, Syllable)’</span><br>
<span style="font-family:"Courier New"">    Expected type: [([(a1, Syllable)], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">      Actual type: [([Syllable], [Sequence Bol])]</span><br>
<span style="font-family:"Courier New"">  * In the second argument of ‘mapMaybe’, namely ‘all_bols’</span><br>
<span style="font-family:"Courier New"">    In the second argument of ‘($)’, namely</span><br>
<span style="font-family:"Courier New"">      ‘mapMaybe (match_bols syllables) all_bols’</span><br>
<span style="font-family:"Courier New"">  * Relevant bindings include</span><br>
<span style="font-family:"Courier New"">      syllables :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:16)</span><br>
<span style="font-family:"Courier New"">      best_match :: [(a1, Syllable)]</span><br>
<span style="font-family:"Courier New"">                    -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))</span><br>
<span style="font-family:"Courier New"">        (bound at Derive/Call/India/Pakhawaj.hs:141:5)</span><o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Arial",sans-serif">Or alternately, taking up a bit more vertical space:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Courier New"">Derive/Call/India/Pakhawaj.hs:142:62:<br>
    Couldn't match type ‘Text’ with ‘(a1, Syllable)’<br>
    Expected type: [([(a1, Syllable)], [Sequence Bol])]<br>
      Actual type: [([Syllable], [Sequence Bol])]</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
        -----------------------------<span style="font-family:"Courier New""><br>
    In the second argument of ‘mapMaybe’, namely ‘all_bols’<br>
    In the second argument of ‘($)’, namely<br>
      ‘mapMaybe (match_bols syllables) all_bols’</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
        -----------------------------<span style="font-family:"Courier New""><br>
    Relevant bindings include</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Courier New"">      syllables :: [(a1, Syllable)]<br>
        (bound at Derive/Call/India/Pakhawaj.hs:141:16)<br>
      best_match :: [(a1, Syllable)]<br>
                    -> Maybe (Int, ([(a1, Syllable)], [(a1, Sequence Bol)]))<br>
        (bound at Derive/Call/India/Pakhawaj.hs:141:5)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:6.0pt;margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<span style="font-family:"Arial",sans-serif">Thoughts?  It seems simple enough that I could do myself, but of course not without buy-in.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>