Haskell印刷字符串

时间:2016-03-03 18:07:51

标签: haskell

如何使用换行符在Haskell中打印字符串?

printString :: String -> String -> String -> String
printString s1 s2 s3 = (s1++"\n"++s2++"\n"++s3)

使用该功能时,它会打印整行,包括换行符

3 个答案:

答案 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。因为如果你正在执行某些事情,你可能想看看结果是什么。编译代码不会这样做;它只打印你明确告诉它的内容。