<div dir="ltr"><div><div>I agree. 4 is the current GHC invariant.<br><br></div>i.e., re-parsing a pretty printed parse tree gives you back a parse tree identical to the original (ignoring SrcSpans)<br><br></div>Alan<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 28 July 2017 at 20:34, MarLinn <span dir="ltr"><<a href="mailto:monkleyon@gmail.com" target="_blank">monkleyon@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><span class="">
    <blockquote type="cite">
      <p>by</p>
      <blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
        <pre> (parser . prettyPrint . parser) = id  </pre>
      </blockquote>
      <p>I meant </p>
      <pre>(prettyPrint . parser . prettyPrint) = id</pre>
      <p>for a valid input.</p>
    </blockquote>
    </span><p>Simplifying, <tt>(parser ∷ String → something)</tt>, and <tt>(prettyPrint
        ∷ something → String)</tt>.</p>
    <p>Therefore, <tt>(parser . prettyPrint . parser ∷ String →
        something)</tt> and <tt>(prettyPrint . parser . prettyPrint ∷
        something → String)</tt>.</p>
    <p>Therefore, both criteria could only apply for <tt>(something ~
        String)</tt>. But as pretty printing adds quotation marks, not
      even that is true.</p>
    <p>There are four formulations that might be applicable:</p>
    <ol>
      <li>
        <p> <tt>parser . prettyPrint ≍ id <br>
          </tt></p>
      </li>
      <li>
        <p><tt>prettyPrint . parser </tt><tt><tt>≍</tt> id -- ∷ String
            → String, useless here<br>
          </tt></p>
      </li>
      <li>
        <p> <tt>prettyPrint . parser . </tt><tt><tt>prettyPrint</tt> </tt><tt><tt>≍</tt>
          </tt><tt>prettyPrint</tt></p>
      </li>
      <li>
        <p><tt>parser . prettyPrint . parser </tt><tt><tt>≍</tt> </tt><tt>parser</tt></p>
      </li>
      <li>Well, you could go beyond to <tt>(</tt><tt>prettyPrint .
          parser . </tt><tt>prettyPrint</tt><tt> . pa</tt><tt>rser </tt><tt>≍</tt><tt>
        </tt><tt>prettyPrint</tt><tt> . </tt><tt>parser</tt><tt>)</tt>
        etc…<br>
      </li>
    </ol>
    <p>I don't think 1 (or 2) follow from one of the last two. But 1
      does imply them. So it is a stronger criterion than both, and
      therefore probably not the one to choose. Assuming the parser is
      internally consistent, 3 just says something about the internal
      consistency of the pretty printer, while 4 says something about
      the relationship of the pretty printer to the parser. Thus 4 looks
      like the best candidate for a criterion. Possibly with 3 as a
      secondary target.</p>
    <p>Cheers,<br>
      MarLinn</p>
  </div>

<br>______________________________<wbr>_________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/ghc-devs</a><br>
<br></blockquote></div><br></div>