如何在Haskell中漂亮地打印表格?

17
我想在Haskell中美化打印一个表格数据结构(列的列表)。
例如...
Table [
    StrCol "strings" ["a", "bc", "c"],
    IntCol "ints" [1, 30, -2],
    DblCol "doubles" [2.0, 4.5, -3.2]]

应该呈现出类似于...

strings ints doubles
    "a"    1     2.0
   "bc"   30     4.5
    "c"   -2    -3.2

目前我已经在最新版的Haskell平台中实现了这个功能,它在Text.PrettyPrint中。不幸的是,<+>运算符会使多行文档“对角线”排列。

例如:

(text "a" $+$ text "b") <+> (text "c" $+$ text "d")

呈现为

a
b c
  d

而不是

a c
b d

因此,我首先将单元格进行转置并水平合并,然后垂直合并,但这会导致列不对齐。
在较旧的表格漂亮打印问题中,augustss提到添加一些代码以使列自动适应最宽的条目。
我猜想,具有每列最大长度的"sizedText"函数可以实现这一点,但是该函数似乎不是Haskell Platform Text.PrettyPrint模块的一部分(我认为它在密切相关的Text.Pretty包中)。
实现这种漂亮打印功能的最简单非hacky方法是什么?这是我的项目的一小部分,所以我希望避免编写自己的漂亮打印,并尽可能避免使用模块依赖。

1
使用漂亮打印器,您只能从左到右打印,然后将行连接在一起。最简单的方法是先转置矩阵,然后可以从左到右工作。通常您无法找到“Doc”的宽度,因此在需要填充的位置,您必须在使用“text”创建“Doc”之前将其添加到字符串中。 - stephen tetley
1个回答

21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接