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

If statement Haskell-do块中的语法(使用IO),if-statement,haskell,io,do-notation,If Statement,Haskell,Io,Do Notation,编译器说 The last statement in a 'do' construct must be an expression: rmax <- getInteger “do”构造中的最后一条语句必须是表达式: rmax您的缩进可能会因为标签和空格的混合而混乱。事实上,您的问题中的代码片段中似乎有一个游离的选项卡,我假设您是直接从源文件粘贴的 最有可能的是,GHC对选项卡的解释与编辑器显示选项卡的方式不同,因此它认为do块在相关行之后结束 根据经验,最好只在Haskell中使用空格。

编译器说

The last statement in a 'do' construct must be an expression:
rmax <- getInteger
“do”构造中的最后一条语句必须是表达式:
rmax您的缩进可能会因为标签和空格的混合而混乱。事实上,您的问题中的代码片段中似乎有一个游离的选项卡,我假设您是直接从源文件粘贴的

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


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

因为rmax“游离选项卡”清晰可见。通过始终使用{;}显式分隔符,可以完全避免此类错误。那么空格或制表符就不能破译代码,不管视觉外观多么不连贯。。。谢谢我现在已将记事本++设置更改为不使用选项卡。
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