【问题标题】:A mystery involving putStrLn一个涉及 putStrLn 的谜团
【发布时间】:2019-02-20 21:36:19
【问题描述】:

为什么下面这段代码会产生错误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’

【问题讨论】:

    标签: haskell syntax-error io-monad do-notation


    【解决方案1】:

    两个 sn-ps 都有同样的问题。如果您将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!"
    

    【讨论】:

    • 我突然想到缩进可能是问题所在,然后我看到了你的答案。不幸的是,在我用来学习 Haskell 的书中,没有提到这种特殊缩进的必要性,所以很高兴知道。 :)
    【解决方案2】:

    它也适用于始终使用显式分隔符:

    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!" }
    

    这不是很好的缩进样式的替代品,而是对它的补充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多