wl-pprint-extras中的可选空格和多个替代选项

时间:2015-02-10 18:34:37

标签: haskell pretty-print

是否有一种好的/可接受的方式来获得两种以上的替代布局,特别是以支持可选空间的方式?

特别是,我可能想以三种方式之一打印列表:

[1, 2, 3, 4, 5]

[1,2,3,4,5]

[ 1
, 2
, 3
, 4
, 5
]

按照优先顺序排列。

1 个答案:

答案 0 :(得分: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示例,另一个不能容纳。{ / p>

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
]