如何使用换行符在Haskell中打印字符串?
printString :: String -> String -> String -> String
printString s1 s2 s3 = (s1++"\n"++s2++"\n"++s3)
使用该功能时,它会打印整行,包括换行符
答案 0 :(得分:3)
如前所述,您的代码与打印无关。 (它的名字也不应该是 print !)打印是一个有效的副作用(它会在屏幕上显示出某些东西!)因此不能在IO
类型中无约束地完成。
至于生成单个三行字符串的实际任务,完全由您建议的解决方案实现。 "This\nis\ntest"
是一个三行字符串,如
Prelude> lines $ printString "This" "is" "test"
["This","is","test"]
当你写
时,GHCi实际上并没有输出三行的原因Prelude> "This\nis\ntest"
"This\nis\ntest"
用于此目的的print
函数始终保证在Haskell代码中可以安全使用的格式,因此它将字符串放在引号中并转义所有棘手的字符,包括换行符。
如果您只是想按字母顺序将字符串转储到终端,请使用putStrLn
代替print
。
Prelude> putStrLn $ printString "This" "is" "test"
This
is
test
答案 1 :(得分:1)
在ghci中,您只需输入
即可putStrLn "line1\nline2"
如果你想编写一个程序来执行此操作,你需要确保putStrLn
在IO monad中运行,例如,将它放在main
main = do
<do stuff>
putStrLn "line1\nline2"
<do other stuff>
答案 2 :(得分:0)
您的printString
函数不打印字符串,只需返回字符串。因为你在GHCi中运行它,它会打印出来。但它是印刷它的GHCi;你的功能本身什么都不打印。
如果您要编译一些调用printString
的代码,您会发现没有任何内容被打印出来。
默认情况下,GHCi会将内容打印为表达式。如果您希望将字符串不加改变地写入控制台,则需要使用putStrLn
,正如其他答案所示。比较:
Prelude> print "1\n2"
"1\n2"
Prelude> putStrLn "1\n2"
1
2
基本上,当您在GHCi中编写表达式时,如果可能,它会自动在结果上调用print
。因为如果你正在执行某些事情,你可能想看看结果是什么。编译代码不会这样做;它只打印你明确告诉它的内容。