Haskell:单词从一个getLine开始计算,不带“";“做”;符号
如何在不使用“do”符号的情况下编写以下函数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
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,非常感谢。