编译器说
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
最佳答案
您的缩进可能因为混合了制表符和空格而弄乱了。事实上,您问题的代码片段中似乎有一个杂散的制表符,我假设您是直接从源文件粘贴的。
很可能,GHC 对选项卡的解释与您的编辑器显示它们的方式不同,因此它认为 do
block 在相关行之后结束。
根据经验,在 Haskell 中最好只使用空格。该语言为大多数代码编辑器不同意的解释制表符定义了非常具体的规则,但空格是明确且一致的。
关于if-statement - Haskell - do block 中的语法(使用 IO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8700167/