我正在从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
任何人都可以帮我吗?
答案 0 :(得分:3)
正如您验证的那样,问题在于您使用标签进行缩进,这通常是一个坏主意,尤其是在缩进很重要的语言中,尤其是在混合制表符和空格时。
编译器/解释器必须将这些选项卡转换为特定数量的空格以理解代码的缩进级别,并且它所做的转换可能与您在视觉上看到的不同,因此您最终可能会代码看起来对您而言,但不适用于编译器/解释器。
在这种情况下,似乎ghc的解析器而不是在let中看到let
的以下声明,但好像它们是这样的:
let number = read numberString
text = lines contents
它告诉您text = lines contents
行缺少let
。
只需为Haskell使用空格,您再也不会遇到此问题了。