Haskell:从 getLine 中计算字数,不带 "do"符号

标签 haskell getline notation

如何在不使用“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 表示法 block 转换为其等价的单子(monad)(仅使用 >>>>=)。 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
    

关于Haskell:从 getLine 中计算字数,不带 "do"符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37662754/

相关文章:

powershell - 此语法有何作用 : | select @{E={$_. PSComputerName}; L ='Server' },名称,进程 ID,路径名?

haskell - 使用 Data.Map.map 对值求和

C getline() 在 EOF 之前返回 -1

c++ - : (a == 0) vs (0 == a)的优缺点

c++ - 使用getline从输入文件打印时如何忽略空行

c++ - 强大的数字用户输入功能,但零不被视为数字

Python 为什么是 10e26 != 10**26 ? ( float 不准确?)

string - 我将如何在 haskell 中的空格后拆分字符串?

data-structures - 数据结构差异化,直觉构建

haskell - GHCi 对 MonadError 的默认实现是什么?