<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:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@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="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">If I were to try to find a way to get rid of these things, should I try hacking on the static argument transformation, or would it fit better in the simplifier, or somewhere else?<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Calibri","sans-serif";mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri","sans-serif";mso-fareast-language:EN-US">Yes, this is just what the static argument transformation is for. I’ve added your example to
<a href="https://ghc.haskell.org/trac/ghc/ticket/9374">https://ghc.haskell.org/trac/ghc/ticket/9374</a><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri","sans-serif";mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri","sans-serif";mso-fareast-language:EN-US">Simon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri","sans-serif";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""> ghc-devs [mailto:ghc-devs-bounces@haskell.org]
<b>On Behalf Of </b>David Feuer<br>
<b>Sent:</b> 16 September 2014 03:03<br>
<b>To:</b> ghc-devs<br>
<b>Subject:</b> Cleaning up rather silly static arguments<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Aside from anything having to do with the foldrW/buildW stuff, I decided to try a little experiment using fusing scanl and reverse (implementations at
<a href="http://lpaste.net/2416758997739634688" target="_blank">http://lpaste.net/2416758997739634688</a> )<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">When I define<br>
<br>
scanr f b = reverse . scanl (flip f) b . reverse<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt">I get this:<br>
<br>
scanr1<br>
scanr1 = \ @ a_akP _ eta_Xb -> eta_Xb<br>
<br>
scanr<br>
scanr =<br>
  \ @ a_akP @ a1_akQ f_ah8 b_ah9 eta_B1 -><br>
    letrec {<br>
      go_amb<br>
      go_amb =<br>
        \ ds_amc eta1_Xa eta2_B2 eta3_Xc -><br>
          case ds_amc of _ {<br>
            [] -> eta1_Xa eta2_B2 eta3_Xc;<br>
            : y_amh ys_ami -><br>
              go_amb<br>
                ys_ami<br>
                (\ x_an9 eta4_Xj -><br>
                   let {<br>
                     b'_ana<br>
                     b'_ana = f_ah8 y_amh x_an9 } in<br>
                   eta1_Xa b'_ana (: b'_ana eta4_Xj))<br>
                eta2_B2<br>
                eta3_Xc<br>
          }; } in<br>
    go_amb eta_B1 (scanr1) b_ah9 (: b_ah9 ([]))<o:p></o:p></p>
</div>
<p class="MsoNormal">go_amb takes four arguments, two of which, eta2_B2 and eta3_Xc, are static. What makes this seem particularly silly is that we already have all the structure we need to get rid of them—all that remains is to actually delete them and replace
 them with the values they take:<br>
<br>
scanr1<br>
scanr1 = \ @ a_akP _ eta_Xb -> eta_Xb<br>
<br>
scanr<br>
scanr =<br>
  \ @ a_akP @ a1_akQ f_ah8 b_ah9 eta_B1 -><o:p></o:p></p>
</div>
<p class="MsoNormal">    let {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">      listend<o:p></o:p></p>
</div>
<p class="MsoNormal">      listend = : b_ah9 ([])} in<o:p></o:p></p>
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">    letrec {<br>
      go_amb<br>
      go_amb =<br>
        \ ds_amc eta1_Xa  -><br>
          case ds_amc of _ {<br>
            [] -> eta1_Xa b_ah9 listend;<br>
            : y_amh ys_ami -><br>
              go_amb<br>
                ys_ami<br>
                (\ x_an9 eta4_Xj -><br>
                   let {<br>
                     b'_ana<br>
                     b'_ana = f_ah8 y_amh x_an9 } in<br>
                   eta1_Xa b'_ana (: b'_ana eta4_Xj))<br>
          }; } in<br>
    go_amb eta_B1 (scanr1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Now I certainly wouldn't claim this is particularly *good* code, but it seems significantly more reasonable than before.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">If I were to try to find a way to get rid of these things, should I try hacking on the static argument transformation, or would it fit better in the simplifier, or somewhere else?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">David<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>