如何在不使用"do"表示法的情况下编写以下函数?
wordsCount = do
putStr "Write a line and press [enter]:n"
s <- getLine
putStr $ show $ length . words $ s
putChar 'n'
您可以使用 >>
和 >>=
来代替do
:
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
符号块转换为其一元等价物(仅使用>>
和>>=
)。 do
只是语法糖,因此不必每次都编写>>=
和/或管理变量。
附加说明:
正如@ChadGilbert在他的评论中所说,括号应该括在函数周围,排除
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