2016-09-29 62 views
0

我正在學習learnyouhaskell.com的Haskell,並在編譯我的程序時收到此錯誤消息。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

這可能是一個製表符問題。嘗試刪除縮進的製表符並改爲使用空格。 – Bakuriu

+1

@Bakuriu我證實了這是一個選項卡問題 - 在let表達式後的縮進必須與空格(此外它是混合標籤/空格) - 我想你的評論將是答案(我不會' t已經發現過) – epsilonhalbe

+0

謝謝。現在它工作。是否有任何解決方案使用與選項卡字符的哈斯克爾? –

回答

3

正如您驗證的那樣,問題在於您正在使用製表符縮進,這通常是一個壞主意,特別是在縮進很重要的語言中,特別是在混合製表符和空格時。

編譯器/解釋器必須將這些選項卡轉換爲一定數量的空格才能理解代碼的縮進級別,並且它所做的轉換可能與您在視覺上看到的不同,因此您最終可能與代碼看起來罰款給你,但不是編譯器/解釋器。

在這種情況下,它似乎是GHC的解析器看到讓內你let以下聲明,但是好像他們是這樣的:

let number = read numberString 
text = lines contents 

而且它告訴你, text = lines contents行缺少let

只需使用Haskell的空格,您將永遠不會再遇到此問題。

+3

大多數(現代)編輯器都有一個「替換帶空格的選項卡」選項 - 如果你使用的是vim,例如在你的'.vimrc'文件中設置expandtab – epsilonhalbe

相關問題