Haskell中print和putStrLn的区别

76

我很困惑。我尝试使用print,但我知道人们使用putStrLn。它们之间的真正区别是什么?

print $ function 
putStrLn $ function

37
print = putStrLn . show 的翻译是:将 print 定义为 putStrLn . show - Satvik
6
你尝试过在ghci中运行print 3putStrLn 3print "three"putStrLn "three"吗?这个问题可以通过一些实验来回答。 - Jonathan Cast
不请自来的插件:定义proom = putStrLn . groom(来自groom包)大大提高了AST的可读性。不再需要寻找“下一个元素从哪里开始”的麻烦了。 - ron
1个回答

116
函数 putStrLn 接受一个 String 并显示在屏幕上,后面跟着一个换行符(put a String followed by a new Line)。
因为它仅适用于 String,常见的用法是取任何对象,将其转换为 String,然后应用 putStrLn 来显示它。将对象转换为 String 的通用方式是使用 show 函数,因此你的代码最终会有很多这样的写法。
putStrLn (show 1)
putStrLn (show [1, 2, 3])
putStrLn (show (Just 42))

一旦你注意到这一点,定义一个将其转换为 String 并在一步中显示字符串的函数就不是很难了。

print x = putStrLn (show x)

这正是print函数所做的。


1
putStrLn 可以显示像 "я" 这样的非 ASCII 字符,而 print 则不能。虽然我不知道为什么。尝试一下 putStrLn "я"print "я" - CMCDragonkai
3
@CMCDragonkai 这正是我在答案中提到的原因。print 函数在 show 的输出上调用 putStrLn,而 show 函数将字符串转换为它们的 Unicode 表示形式以便显示。'я'(西里尔字母“ya”)的 Unicode 码点是 U+044F,或者十进制数 1103,这就是为什么 show "я" 输出 "\"\\1103\"" —— 这就是你需要在 ghci 中键入的七个字符的字符串 "\1103"(试试看!) - Chris Taylor
这是否意味着在一般情况下使用 putStrLn 处理文本会更好? - CMCDragonkai
8
如果你有一个要打印到屏幕上的字符串,应该使用 putStrLn。如果你想要打印的不是字符串,就应该使用 print。看一下它们的类型!putStrLn :: String -> IO()print :: Show a => a -> IO() - Chris Taylor
4
你似乎有些困惑。putStrLnprint 之间唯一的区别就是 print 首先对它的输入调用了 show 方法。任何结果上的差异都是因为你在一个情况下对输入调用了 show,而在另一个情况下没有。因此,在选择使用哪个函数时,要问自己 - 我是否想要在输入上调用 show 方法?如果输入是一个字符串,则几乎肯定需要先调用 show - Chris Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接