Haskell中Print和putStrLn之间的区别

Ami*_*aei 49 printing haskell ghc

我很迷惑.我尝试使用print,但我知道人们适用putStrLn.它们之间有什么真正的区别?

print $ function 
putStrLn $ function
Run Code Online (Sandbox Code Playgroud)

Chr*_*lor 84

该函数putStrLn采用a String并将其显示在屏幕上,然后是换行符(放置一个String后跟一个新的L i n e).

因为它只与作品StringS,一个常见的成语是采取任何对象,将其转换为一个String,然后应用putStrLn来显示它.一个对象转换为一个通用的方法String是用show功能,让你的代码最终会得到很多的

putStrLn (show 1)
putStrLn (show [1, 2, 3])
putStrLn (show (Just 42))
Run Code Online (Sandbox Code Playgroud)

一旦你注意到,定义一个转换为a的函数String并在一个步骤中显示字符串并不是一个很大的延伸

print x = putStrLn (show x)
Run Code Online (Sandbox Code Playgroud)

这正是print函数的功能.

  • 如果你想要在屏幕上打印一个`String`,你应该使用`putStrLn`.如果你想要打印一些*除了'String`之外的东西,你应该使用`print`.看看类型!`putStrLn :: String - > IO()`和`print :: Show a => a - > IO()`. (4认同)
  • `putStrLn` 可以显示非 ASCII 字符,如“я”,而 `print` 则不能。我真的不知道为什么。尝试 `putStrLn "я"` 与 `print "я"`。 (2认同)
  • @CMCDragonkai这是我给出答案的原因。print函数在show的输出上调用putStrLn,show函数将字符串转换为unicode表示形式以显示它们。“я”(西里尔字母“ ya”)的unicode点是U + 044F或十进制的1103,这就是为什么“ show“я”`输出`“ \” \\ 1103 \“”`的原因-这就是您的意思必须输入ghci才能获得由七个字符“ \ 1103”组成的字符串(尝试!) (2认同)
  • 你好像有点糊涂了。从字面上看,`putStrLn` 和 `print` 之间的唯一区别是 `print` 首先在其输入上调用 `show`。结果之间的任何差异是因为您在一种情况下对输入调用了`show`,而在另一种情况下没有。因此,在选择使用哪个时,问问自己 - 我是否想在输入上调用“show”?如果输入是一个`String`,那么你几乎肯定*不想*想先调用`show`。 (2认同)