String Haskell中不带Text.Printf的字符串格式列

String Haskell中不带Text.Printf的字符串格式列,string,haskell,formatting,output,printf,String,Haskell,Formatting,Output,Printf,我是哈斯克尔的新手。我正处于学校项目的最后阶段。我必须获取元组并将它们打印到输出文件中,然后用制表符列将它们分开。所以(7094226408)、(129654226412)和(54226016)应该具有 709 4226408 12965 4226412 5 4226016 我一直想做的是: genOutput :: (Int, Int) -> String genOutput (a,b) = (show a) ++ "\t" ++ (show

我是哈斯克尔的新手。我正处于学校项目的最后阶段。我必须获取元组并将它们打印到输出文件中,然后用制表符列将它们分开。所以(7094226408)、(129654226412)和(54226016)应该具有

709     4226408
12965   4226412
5       4226016
我一直想做的是:

genOutput :: (Int, Int) -> String
genOutput (a,b) = (show a) ++ "\t" ++ (show b)
这将产生如下输出:

"709\t4226408"
"12965\t4226412"
"5\t4226016"
这有三个问题。1) 引号仍然出现在输出中。2) \t选项卡实际上并不是一个选项卡空间。每当我尝试为“”创建一个实际的选项卡时,它都会显示为一个“”空格。3) 它们没有像上面的示例那样对齐到列中。我知道Text.Printf存在,但我们不允许导入除以下内容以外的任何内容:

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

我想这就是你从GHCi得到的结果吧?尝试改用
putStrLn

Prelude>genOutput(1,42)
“1\t42”
序曲>putStrLn$genOutput(1,42)
1       42                                                     

为什么呢? 如果您告诉GHCi对表达式求值,它会这样做,并(或多或少地)使用
show
-
show
输出它。show设计用于
read
,通常会输出一个值,就好像您要将其直接输入Haskell一样。对于将包含转义序列和
s的字符串

现在使用
putStrLn
它将获取字符串并按预期将其打印到stdout


使用
打印

另一个原因可能是您使用
print
输出您的值-
print
show
+
putStrLn
,因此它将首先显示值,然后重新引入转义符(正如GHCi所做的那样)-因此,如果使用
print
将其更改为
putStrLn
如果使用
String
s

如何打印字符串?