Haskell - 由于使用制表符而不是空格而导致语法错误

时间:2016-09-29 08:07:56

标签: haskell syntax

我正在从learnyouhaskell.com学习Haskell,并在编译程序时收到此错误消息。

错误:

baby.hs:25:26: error:
    parse error on input `='
    Perhaps you need a 'let' in a 'do' block?
    e.g. 'let x = 5' instead of 'x = 5'

代码:

bump :: [String] -> IO ()
bump [fileName, numberString] = do
    handle <- openFile fileName ReadMode
    (tempName, tempHandle) <- openTempFile "." "temp"
    contents <- hGetContents handle
    let number = read numberString
        text = lines contents
        bumpLine = text !! number
        newText = delete (text !! number) text
    hPutStr tempHandle $ unlines (bumpLine:newText)
    hClose handle
    hClose tempHandle
    removeFile fileName
    renameFile tempName fileName

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:3)

正如您验证的那样,问题在于您使用标签进行缩进,这通常是一个坏主意,尤其是在缩进很重要的语言中,尤其是在混合制表符和空格时。

编译器/解释器必须将这些选项卡转换为特定数量的空格以理解代码的缩进级别,并且它所做的转换可能与您在视觉上看到的不同,因此您最终可能会代码看起来对您而言,但不适用于编译器/解释器。

在这种情况下,似乎ghc的解析器而不是在let中看到let的以下声明,但好像它们是这样的:

let number = read numberString
text = lines contents

它告诉您text = lines contents行缺少let

只需为Haskell使用空格,您再也不会遇到此问题了。