【问题标题】:Haskell - 2D List of Ints to StringHaskell - 整数到字符串的二维列表
【发布时间】:2019-04-16 13:48:47
【问题描述】:

我希望将 2D 列表转换为格式化字符串。

table :: [[Int]] -> String

Input: [[11,2,30],[4,555,9]]

Output: " 11   2 30 \n  4 555   6 \n"

        11   2  30
         4 555   9

基本上需要能够以网格形状打印并保持格式以考虑最大值。

我知道对于简单的列表,我可以根据 ghci 映射显示 [1,2,3,4] -> ["1","2","3","4"]。不过,这似乎将其保留为列表?

不确定如何遍历 2D 并继续连接为字符串并根据需要添加 \n

【问题讨论】:

  • 您好 Eli,如果您能向我们展示一个您迄今为止尝试过的示例,以及当前输出与预期输出的对比(或您可能出现的任何错误),将会更有帮助遇到)。
  • wordslines 可能对您的尝试很有帮助。关于排列列,您可以尝试在字符串中使用 maximumlength,并在 replicate 前面加上 ' ' 字符以使宽度相等。
  • 您知道您将使用什么算法并且在实施时遇到了困难,或者您甚至无法从算法上弄清楚该做什么?如果您正在寻找预先打包的漂亮打印解决方案建议,那么这显然是题外话,但 reddit 上的人可能会很有帮助。
  • @ThomasM.DuBuisson 我很难弄清楚该做什么。到目前为止,我已经设法通过 2D 列表并将它们所有内部整数元素转换为字符串,但我想要的是抓住元素并将它们形成一个字符串。
  • 把它们变成 a 字符串很容易。您可以concat 整个字符串列表。但是,您想用空格填充每个值以使每列具有匹配的长度。你能通过算法来实现这一点吗?

标签: string list haskell int


【解决方案1】:

参加 REPL 会有所帮助。

> :t '1'
'1' :: Char

> :t "1"
"1" :: [Char]

> ['1','2']
"12" :: [Char]

> :t concat
concat :: [[a]] -> [a]

> concat ( map show [1,2,3,4] )
.....

> concat [ show x | x <- [1,2,3,4] ]
.....

> concat [ " " ++ ( ensureWidth 9 (show x) ) | x <- [1,2,3,4] ]
.....

> :t replicate
replicate :: Int -> a -> [a]

> replicate 2 '1'
"11" :: [Char]

现在你需要编写函数

ensureWidth w s = replicate n ' ' ++ s

但是要使用什么n?为此,您需要知道s 的长度。功能length可以提供帮助。

【讨论】:

  • 在示例中,所需的宽度取决于列中的最大长度项目,因此它将是maximum . map length &lt;$&gt; transpose 样式操作。
  • @ThomasM.DuBuisson 是的,这将是合乎逻辑的下一步,因为 OP 会问自己,“为什么是 10 的宽度?”。 :)
猜你喜欢
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多