main = do
line <- getLine
if null line
then return ()
else do
putStrLn $ reverseWords line
main
reverseWords :: String -> String
reverseWords = unwords . map reverse . words
其中return存在的意义是每一个结果必须要有一个I/O actions来结尾,而return可以生成一个I/O actions,所以return不会有任何实质作用,仅是程序性作用。
不过return也有实际作用:以下两段代码输出一致,注意观察写法的不同,
main = do
a <- return "hell"
b <- return "yeah!"
putStrLn $ a ++ " " ++ b
main = do
let a = "hell"
b = "yeah"
putStrLn $ a ++ " " ++ b
以下是第一段代码的部分函数的类型和作用:
ghci> :t unwords
unwords :: [String] -> String
ghci> unwords ["jack", "blue"]
"jack blue"
ghci> :t reverse
reverse :: [a] -> [a]
ghci> reverse ["jack", "blue"]
["blue","jack"]
ghci> reverse "jack blue"
"eulb kcaj"
ghci> map reverse ["jack", "blue"]
["kcaj","eulb"]
ghci> :t words
words :: String -> [String]
ghci> words "jack blue"
["jack","blue"]