Haskell:单词从一个getLine开始计算,不带“";“做”;符号

Haskell:单词从一个getLine开始计算,不带“";“做”;符号,haskell,getline,notation,Haskell,Getline,Notation,如何在不使用“do”符号的情况下编写以下函数 wordsCount = do putStr "Write a line and press [enter]:\n" s <- getLine putStr $ show $ length . words $ s putChar '\n' wordscont=do putStr“写一行并按[enter]:\n” s您可以使用和,而不是使用: 或使其更易于阅读: wordsCount = putStr "Wr

如何在不使用“do”符号的情况下编写以下函数

wordsCount =  do 
    putStr "Write a line and press [enter]:\n"
    s <- getLine
    putStr $ show $ length . words $ s
    putChar '\n'
wordscont=do
putStr“写一行并按[enter]:\n”
s您可以使用和,而不是使用:

或使其更易于阅读:

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
    
    wordsCount = putStr "Write a line and press [enter]:\n" >>
        getLine >>=
        putStrLn . show . length . words
    
  • 您可以使用,而不是使用
    putStr
    putChar
    。例如:

    -- 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
    
    wordsCount = putStr "Write a line and press [enter]:\n" >>
        getLine >>=
        putStrLn . show . length . words
    

这两个问题(,)也是关于删除do语法的。也很好地解释了如何做。在更直截了当的翻译中,括号不应该简单地包装
putStr$show$length$words s
语句吗?包装
(\s->putStr$show$length$words)
意味着
s
在后续的一元中不可用statements@ChadGilbert:你的意思是喜欢更新的答案?是的。谢谢你注意到这点。@ChadGilbert:我已经用一个额外的注释更新了答案,以进一步解释isue,非常感谢。