possible bug in pretty-1.0.1.0

Benedikt Huber benjovi at gmx.net
Tue Dec 16 19:56:47 EST 2008


John MacFarlane schrieb:
> I noticed a difference in how "hang" works between pretty-1.0.0.0 and
> pretty-1.0.1.0. I think it's a bug. If this isn't the right place to
> report it, please let me know where I should.  (Maintainer is listed
> as libraries at haskell.org, but that is a closed mailing list.  Perhaps
> Cabal should include a report-bugs-at field?)
> 
> John
> 
> GHCi, version 6.8.3: http://www.haskell.org/ghc/  :? for help
> ...
> Prelude Text.PrettyPrint>  putStrLn $ render $ hang (char '*') 4 (text "hi" $$ text "there")
> Loading package pretty-1.0.0.0 ... linking ... done.
> *   hi
>     there
> 
> GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
> ...
> Prelude Text.PrettyPrint>  putStrLn $ render $ hang (char '*') 4 (text "hi" $$ text "there")
> Loading package pretty-1.0.1.0 ... linking ... done.
> *
>     hi
>     there
Hi John,

I think you're right, from the perspective of 'hang' the last set of 
patches (http://hackage.haskell.org/trac/ghc/ticket/2393) indeed 
introduced a bug.

Unfortunately a good description of what hang is _intended_ to mean is 
still missing in the documentation, but I'll assume that

 > hang (text "*") 4 (sep [ text "hi", text "there" ])

should either layout as

 > * hi there

or

 > *   hi
 >     there

If only the second layout is of interest (like in your example), then

 > hang' d1 n d2 = d1 $$ (nest n d2)

should do the job.

Related issue, we changed vcat to mean (foldr $+$ empty) instead of 
(foldr $$ empty) - either revert this change or update the documentation 
? [1]

Unfortunately, the situations is a bit trickier for hang (i.e. for 
sep[A, nest n B]); allowing overlap violates
   Invariant 7: The first line of the first layout has to be longer than
                the first line of the second layout
because

 > sep [A, nest n B] ~
 > oneLiner (A <+> B) `union` A $$ (nest n B)
 >   with e.g. [A="a",B="b",n="4"]
 > "a b" `union` "a   b"

which causes the pretty printer to select an even longer! line if (A <+> 
B) doesn't fit on one line.
I'm not sure how to resolve this - should sep [A, B] really overlap A 
and B if they do not fit on a line ???
Still, if it seems to be the right thing to do, it is easy to allow 
overlap in sep/cat.

Otherwise hang might need to be changed.

best regards,
benedikt

[1]
Either

hunk ./Text/PrettyPrint/HughesPJ.hs 114
-        vcat is a list version of $$
+        vcat is a list version of $+$
hunk ./Text/PrettyPrint/HughesPJ.hs 316
-vcat   :: [Doc] -> Doc;          -- ^List version of '$$'.
+vcat   :: [Doc] -> Doc;          -- ^List version of '$+$'.

or

hunk ./Text/PrettyPrint/HughesPJ.hs 497
-vcat = reduceAB . foldr (above_' True) empty
+vcat = reduceAB . foldr (above_' False) empty

because of

505: above_' g p q = Above p g q
536: | Above  Doc Bool Doc                  -- True <=> never overlap



More information about the Libraries mailing list