我仍在为 Haskell 苦苦挣扎,现在我遇到了一个问题,即从这个示例中将注意力集中在 Input/Output monad 上:
main = do
line <- getLine
if null line
then return ()
else do
putStrLn $ reverseWords line
main
reverseWords :: String -> String
reverseWords = unwords . map reverse . words
我知道因为像 Haskell 这样的函数式语言不能基于函数的副作用,所以必须发明一些解决方案。在这种情况下,似乎所有东西都必须包装在一个do
块中。我得到了简单的例子,但在这种情况下,我真的需要有人解释:
do
为什么对 I/O 操作使用一个单独的块还不够?- 为什么你必须在 if/else 情况下打开一个全新的?
- 另外,什么时候——我不知道怎么称呼它
do
——monad的“范围”结束,即你什么时候可以使用标准的Haskell术语/函数?