1
是否有一種很好的/可接受的方法來獲得兩種以上的可選佈局,特別是支持可選空間的方式?wl-pprint-extras中的可選空間和多個替代方案
特別是,我可能要在以下三種方式之一來打印清單:
[1, 2, 3, 4, 5]
[1,2,3,4,5]
[ 1
, 2
, 3
, 4
, 5
]
在優先順序
。
是否有一種很好的/可接受的方法來獲得兩種以上的可選佈局,特別是支持可選空間的方式?wl-pprint-extras中的可選空間和多個替代方案
特別是,我可能要在以下三種方式之一來打印清單:
[1, 2, 3, 4, 5]
[1,2,3,4,5]
[ 1
, 2
, 3
, 4
, 5
]
在優先順序
。
您可以在group
和flatAlt
之前先嚐試其他替代方法。
(<|>) :: 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
]
底層的'Doc'有一個'Union'構造函數,它嘗試一個替代方法,如果它不適合整個頁面,則嘗試第二個方法。暴露的唯一方式是通過「group x = Union(flatten x)x」。 – Cirdec 2015-02-10 18:47:10