Haskell 中没有 Text.Printf 的字符串格式化列

String Formatting columns in Haskell without Text.Printf

我是 Haskell 的新手。我在学校项目的最后一部分。我必须获取元组并将它们打印到输出文件中,并用制表符列分隔它们。所以 (709,4226408), (12965,4226412) 和 (5,4226016) 应该有

的输出
709     4226408
12965   4226412
5       4226016

我一直在努力做的是:

genOutput :: (Int, Int) -> String
genOutput (a,b) = (show a) ++ "\t" ++ (show b)

这会产生如下输出:

"709\t4226408"
"12965\t4226412"
"5\t4226016"

这有 3 个问题。 1)报价仍然出现在输出中。 2) \t 制表符实际上并没有变成制表符space。 .每当我尝试为“”制作一个实际的标签时,它只会以“” space 的形式出现。 3)它们不像上面的例子那样对齐到列中。我知道 Text.Printf 存在,但我们不允许导入除以下内容以外的任何内容:

import System.IO
import Data.List
import System.Environment

我猜这就是你从 GHCi 得到的输出?尝试使用 putStrLn 代替:

Prelude> genOutput (1,42)                                      
"1\t42"                                                        
                                                               
Prelude> putStrLn $ genOutput (1,42)                    
1       42                                                     

这是为什么?

如果你告诉 GHCi 计算一个表达式,它会这样做并(或多或少)使用 show 输出它 - show 被设计为与 read 一起工作并且通常会输出一个值,就好像您将它直接输入到 Haskell 中一样。对于将包含转义序列和 "s

的字符串

现在使用 putStrLn 它将获取字符串并将其打印到 stdout,正如您所期望的那样。


使用print

另一个原因可能是您使用 print 来输出您的值 - printshow + putStrLn 所以它会首先显示值重新引入转义符(就像 GHCi 那样)——所以如果你使用 print 如果你使用 Strings

则将其更改为 putStrLn