如何在不使用" do"的情况下编写以下功能?符号
wordsCount = do
putStr "Write a line and press [enter]:\n"
s <- getLine
putStr $ show $ length . words $ s
putChar '\n'
答案 0 :(得分:3)
wordsCount = putStr "Write a line and press [enter]:\n" >> getLine >>= putStr . show . length . words >> putChar '\n'
或者更容易阅读:
wordsCount = putStr "Write a line and press [enter]:\n" >>
getLine >>=
putStr . show . length . words >>
putChar '\n'
更直接的翻译是:
wordsCount = putStr "Write a line and press [enter]:\n" >>
getLine >>=
\s -> (putStr $ show $ length $ words s) >>
putChar '\n'
编译器基本上将这些do
- 符号块转换为其monadic等价物(仅使用>>
和>>=
)。 do
只是语法糖,因此每次都不必编写>>=
和/或管理变量。
附加说明:
正如@ChadGilbert在his comment中所说,括号应该包含在函数中,不包括\s ->
,以便s
可以在以后的程序中使用,例如:
-- This is not an equivalent program
wordsCount = putStr "Write a line and press [enter]:\n" >>
getLine >>=
\s -> (putStr $ show $ length $ words s) >>
putChar '\n' >>
putStrLn s -- repeat s
您可以使用putStrLn
,而不是使用putStr
和putChar
。例如:
wordsCount = putStr "Write a line and press [enter]:\n" >>
getLine >>=
putStrLn . show . length . words