Haskell - do块中的语法(使用IO)

时间:2012-01-02 11:17:00

标签: haskell if-statement io notepad++

编译器说

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

尝试加载包含以下代码段的文件时:

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

1 个答案:

答案 0 :(得分:6)

由于混合标签和空格,您的缩进可能会搞砸。实际上,您的问题中的代码段中似​​乎有一个迷路选项卡,我假设您直接从源文件粘贴。

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

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