Haskell:来自getLine的单词计数没有" do"符号

时间:2016-06-06 16:43:54

标签: haskell getline notation

如何在不使用" do"的情况下编写以下功能?符号

wordsCount =  do 
    putStr "Write a line and press [enter]:\n"
    s <- getLine
    putStr $ show $ length . words $ s
    putChar '\n'

1 个答案:

答案 0 :(得分:3)

您可以使用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 - 符号块转换为其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,而不是使用putStrputChar。例如:

    wordsCount = putStr "Write a line and press [enter]:\n" >>
        getLine >>=
        putStrLn . show . length . words