涉及putStrLn的谜团

use*_*526 1 haskell syntax-error do-notation io-monad

为什么下面的代码会产生错误parse error on input ‘putStrLn’

main = do line <- fmap reverse getLine
   putStrLn $ "You said " ++ line ++ " backwards!"
   putStrLn $ "Yes, you said " ++ line ++ " backwards!"

<interactive>:11:4: error: parse error on input ‘putStrLn’
Run Code Online (Sandbox Code Playgroud)

另外,为什么以下代码会产生错误parse error on input ‘let’

main = do line <- getLine
  let line' = reverse line
  putStrLn $ "You said " ++ line' ++ " backwards!"
  putStrLn $ "Yes, you said " ++ line' ++ " backwards!"


 <interactive>:31:4: error: parse error on input ‘let’
Run Code Online (Sandbox Code Playgroud)

Jos*_*ica 13

两个片段都有同样的问题.如果将do块的第一个动作放在与do自身相同的行上,则仍然必须将do块中的其余动作缩进到第一个动作.有两种方法可以解决它:

main = do line <- fmap reverse getLine
          putStrLn $ "You said " ++ line ++ " backwards!"
          putStrLn $ "Yes, you said " ++ line ++ " backwards!"
Run Code Online (Sandbox Code Playgroud)

要么

main = do
   line <- fmap reverse getLine
   putStrLn $ "You said " ++ line ++ " backwards!"
   putStrLn $ "Yes, you said " ++ line ++ " backwards!"
Run Code Online (Sandbox Code Playgroud)