Вместо использования 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
-notation блоки в его монадический эквивалент (используя только >>
и >>=
). do
- это только синтаксический сахар, так что каждый раз не нужно писать >>=
и/или переменные mange.
Дополнительные примечания:
как сказал @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
Вместо использования putStr
и putChar
, вы можете использовать putStrLn
, Например:
wordsCount = putStr "Write a line and press [enter]:\n" >>
getLine >>=
putStrLn . show . length . words
Эти два вопроса ([1] (http://stackoverflow.com/q/16964732/2211273), [2] (http://stackoverflow.com/q/25255260/2211273)) вопросы также касаются desugaring do синтаксиса. [Этот ответ] (http://stackoverflow.com/a/16726740/2211273) также прекрасно объясняет, как это сделать. – Kritzefitz