我很困惑。我尝试使用print
,但我知道人们使用putStrLn
。它们之间的真正区别是什么?
print $ function
putStrLn $ function
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
函数所做的。
putStrLn
可以显示像 "я" 这样的非 ASCII 字符,而 print
则不能。虽然我不知道为什么。尝试一下 putStrLn "я"
和 print "я"
。 - CMCDragonkaiprint
函数在 show
的输出上调用 putStrLn
,而 show
函数将字符串转换为它们的 Unicode 表示形式以便显示。'я'(西里尔字母“ya”)的 Unicode 码点是 U+044F,或者十进制数 1103,这就是为什么 show "я"
输出 "\"\\1103\""
—— 这就是你需要在 ghci 中键入的七个字符的字符串 "\1103"
(试试看!) - Chris TaylorputStrLn
处理文本会更好? - CMCDragonkaiputStrLn
。如果你想要打印的不是字符串,就应该使用 print
。看一下它们的类型!putStrLn :: String -> IO()
和 print :: Show a => a -> IO()
。 - Chris TaylorputStrLn
和 print
之间唯一的区别就是 print
首先对它的输入调用了 show
方法。任何结果上的差异都是因为你在一个情况下对输入调用了 show
,而在另一个情况下没有。因此,在选择使用哪个函数时,要问自己 - 我是否想要在输入上调用 show
方法?如果输入是一个字符串,则几乎肯定不需要先调用 show
。 - Chris Taylor
print = putStrLn . show
的翻译是:将print
定义为putStrLn . show
。 - Satvikprint 3
、putStrLn 3
、print "three"
和putStrLn "three"
吗?这个问题可以通过一些实验来回答。 - Jonathan Castproom = putStrLn . groom
(来自groom
包)大大提高了AST的可读性。不再需要寻找“下一个元素从哪里开始”的麻烦了。 - ron