2014-02-08 9 views
6

I von H auf LWie erhalten Sie Text.PrettyPrint.HughesPJ.fsep Verhalten in Text.PrettyPrint.Leijen?

import qualified Text.PrettyPrint.HughesPJ as H 
import qualified Text.PrettyPrint.Leijen as L 

und ich habe Probleme übersetzen H.fsep ("paragraph fill") am Schalt.

Dies ist, was ich will:

H.fsep $ map (\ d -> H.parens $ H.fsep $ replicate 4 d) $ map (H.text . show) [1..10] 

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4 4 4 4) (5 5 5 5) (6 6 6 6) 
(7 7 7 7) (8 8 8 8) (9 9 9 9) (10 10 10 10) 

Aber ich dies nur erhalten:

L.fillSep $ map (\ d -> L.parens $ L.fillSep $ replicate 4 d) $ map (L.text . show) [1..10] 

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4 
4 4 4) (5 5 5 5) (6 6 6 6) (7 7 
7 7) (8 8 8 8) (9 9 9 9) (10 10 
10 10) 

(die Formatierung der inneren Dokumente nicht eingehalten) oder dies:

L.fillSep $ map (\ d -> L.parens $ L.align $ L.fillSep $ replicate 4 d) $ map (L.text . show) [1..10] 

(1 1 1 1) (2 2 2 2) (3 3 3 3) (4 
           4 4 4) (5 5 5 5) (6 6 6 6) (7 7 
                  7 7) (8 8 8 8) (9 9 9 
                      9) 
(10 10 10 10) 

das ist hässlich.

Antwort

4

Eine einfache Lösung ist in den Klammern hsep

λ> L.fillSep $ map (\d -> L.parens $ L.hsep $ replicate 4 d) $ map (L.text . show) [1..10] 
(1 1 1 1) (2 2 2 2) (3 3 3 3) 
(4 4 4 4) (5 5 5 5) (6 6 6 6) 
(7 7 7 7) (8 8 8 8) (9 9 9 9) 
(10 10 10 10) 

zu verwenden, aber das bedeutet, dass das innere Dokument stets horizontal gedruckt werden.

Hier ist eine Funktion, die näher am HughesPJ Verhalten ist:

fsep :: [L.Doc] -> L.Doc 
fsep = foldl1 (\x y -> x L.<> (L.group $ L.line L.<> y)) 

λ> fsep $ map (\d -> L.parens $ L.fillSep $ replicate 4 d) $ map (L.text . show) [1..10] 
(1 1 1 1) (2 2 2 2) (3 3 3 3) 
(4 4 4 4) (5 5 5 5) (6 6 6 6) 
(7 7 7 7) (8 8 8 8) (9 9 9 9) 
(10 10 10 10) 

Welche group auf einer einzigen Zeile den Ausgang gesetzt wird durch alle line s space ändern, wenn die resultierende Ausgabe in der aktuellen Zeile passt , während das Original anders formatiert bleibt. So gibt fsep den Anfang einer Liste aus, und wenn das nächste Element vollständig in dieselbe Zeile passt, wird es an diese Zeile angehängt. Andernfalls wird vor dem nächsten Listenelement ein Zeilenumbruch eingefügt.

Im Allgemeinen finde ich es oft einfacher, die Ausgabe zu steuern, indem Sie group manuell statt softline und </> verwenden.