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

标签 haskell pretty-print

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

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

[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
]

关于haskell - wl-pprint-extras 中的可选空格和多个替代项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439182/

相关文章:

haskell - 什么是应用效果?

list - Haskell HXT 解析行和列并获取 [[String]] 而不是 [String]

haskell - 是否有 "trivial constraint"或 "object class"的标准实现?

Haskell - 如何将两个单子(monad) Maybe 函数组合成一个函数

vb6 - 如何使用 VB6 和 MSXML 漂亮地打印 XML 源代码?

c - 如何使用 printf() 格式化字符串以获得相同的输出长度

haskell - 如何在haskell中进行分组和计数?

list - 在 Haskell 中格式化列表输出?

python - 有没有一种简单的方法可以在 vim 中反转 json 的 pretty-print ?

c# - 在 C# 中漂亮地打印 DateTime 值