【问题标题】:Haskell - syntax in do blocks (using IO)Haskell - do 块中的语法(使用 IO)
【发布时间】:2012-01-02 11:17:00
【问题描述】:

编译器说

The last statement in a 'do' construct must be an expression:
rmax <- getInteger

尝试加载包含以下 sn-ps 代码的文件时:

getInteger :: IO Integer
getInteger = readLn

main :: IO ()
main = do  
    putStrLn "specify upper limit of results"  
    rmax <- getInteger
    if rmax `notElem` mot
        then do putStrLn "run again and enter a multiple of 10"
        else do print pAllSorted

它(编译器消息)是什么意思,为什么会出现在这里? (而它不在:)

main = do   
    line <- getLine  
    if null line  
        then return ()  
        else do  
            putStrLn $ reverseWords line  
            main  

reverseWords :: String -> String  
reverseWords = unwords . map reverse . words  

(以上示例取自http://learnyouahaskell.com/input-and-output

【问题讨论】:

  • 因为根据您发布的内容,rmax
  • “流浪标签”清晰可见here。始终使用 { ; 可以完全避免这种类型的错误。 } 显式分隔符。那么空格或制表符不能破坏代码,无论视觉外观可能是不连贯的。

标签: if-statement haskell io do-notation


【解决方案1】:

您的缩进可能因为混合了制表符和空格而弄乱了。事实上,您的问题中的代码 sn-p 中似乎有一个杂散选项卡,我假设您是直接从源文件中粘贴的。

很可能,GHC 对选项卡的解释与编辑器显示它们的方式不同,因此它认为do 块在相关行之后结束。

根据经验,最好在 Haskell 中只使用空格。该语言为解释大多数代码编辑器不同意的选项卡定义了非常具体的规则,但空格是明确且一致的。

【讨论】:

  • 它是...谢谢。我现在已将我的记事本++ 设置更改为不使用标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多