wl-pprint-extras 中的可选空格和多个替代项
Optional spaces and multiple alternatives in wl-pprint-extras
是否有 good/accepted 方法来获得两种以上的替代布局,特别是支持可选空间的方法?
特别是,我可能想通过以下三种方式之一打印列表:
[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
]
是否有 good/accepted 方法来获得两种以上的替代布局,特别是支持可选空间的方法?
特别是,我可能想通过以下三种方式之一打印列表:
[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
]