if-statement - Haskell - do block 中的语法(使用 IO)

标签 if-statement haskell io do-notation

编译器说

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)

最佳答案

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

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

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

关于if-statement - Haskell - do block 中的语法(使用 IO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8700167/

相关文章:

c++ - 并行读取多个文件

file-io - 如何在 Haskell 中创建内存中的句柄?

python - 如何检查列表的元素是否在字符串中

arrays - 如何检查数组中每个元素的条件?

haskell - (,) 是如何在内部定义的?

haskell - 在严格的、不纯粹的语言中,柯里化(Currying)/偏应用如何工作?

python - 如何从串口完全读取数据?

loops - Arduino循环中的奇怪行为

c++ - 优化条件

haskell - 如何在 haskell 中正确输入可选参数