Тайна с участием putStrLn - PullRequest
       59

Тайна с участием putStrLn

0 голосов
/ 21 февраля 2019

Почему фрагмент кода ниже выдает ошибку 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’

Кроме того, почему следующий фрагмент кода выдает ошибку 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’

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это также работает, когда повсеместно используются явные разделители:

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

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

Это не замена для хорошего стиля отступа, а дополнение к нему.

0 голосов
/ 21 февраля 2019

Обе фрагменты имеют ту же проблему.Если вы поместите первое действие блока do в ту же строку, что и сам do, вам все равно придется отступить от остальных действий в блоке do до первого.Два варианта исправить это:

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

или

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