2015-02-10 25 views
1

是否有一種很好的/可接受的方法來獲得兩種以上的可選佈局,特別是支持可選空間的方式?wl-pprint-extras中的可選空間和多個替代方案

特別是,我可能要在以下三種方式之一來打印清單:

[1, 2, 3, 4, 5] 

[1,2,3,4,5] 

[ 1 
, 2 
, 3 
, 4 
, 5 
] 
在優先順序

+0

底層的'Doc'有一個'Union'構造函數,它嘗試一個替代方法,如果它不適合整個頁面,則嘗試第二個方法。暴露的唯一方式是通過「group x = Union(flatten x)x」。 – Cirdec 2015-02-10 18:47:10

回答

5

您可以在groupflatAlt之前先嚐試其他替代方法。

(<|>) :: Doc e -> Doc e -> Doc e 
a <|> b = group $ flatAlt b a 

infixl 5 <|> 

我們將定義你的三個例子。

{-# LANGUAGE OverloadedStrings #-} 

import Text.PrettyPrint.Free 
import System.IO 

items = map char ['1'..'5'] 

widest = brackets . hcat . punctuate ", " $ items 
wide = brackets . hcat . punctuate "," $ items 
skinny = brackets . hcat . punctuate "," . map (\x -> " " <> x <> linebreak) $ items 

最寬的這些適合在屏幕上,widestFits上,可以在其上面定義的<|>來定義。

widestFits = widest <|> wide <|> skinny 

我們將努力在三個文件,一個足夠寬,能夠容納widest例如,一個只寬度足以容納wide例子,一個不能容納任何漂亮的印刷這些。

main = do 
    displayIO stdout $ renderPretty 1.0 15 widestFits 
    putStrLn "" 
    displayIO stdout $ renderPretty 1.0 14 widestFits 
    putStrLn "" 
    displayIO stdout $ renderPretty 1.0 10 widestFits 
    putStrLn " 

這會導致所需的輸出。

[1, 2, 3, 4, 5] 
[1,2,3,4,5] 
[ 1 
, 2 
, 3 
, 4 
, 5 
]