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



如何在不使用"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 ,而不是使用putStrputChar。例如:

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

相关内容

  • 没有找到相关文章

最新更新