Haskell编译错误:不在作用域内。

3

我正在尝试通过编写简单的文件复制工具来学习Haskell:

main = do
         putStr "Source: "
         srcPath <- getLine
         putStr "Destination: "
         destPath <- getLine
         putStrLn ("Copying from " ++ srcPath ++ " to " ++ destPath ++ "...")
         contents <- readFile srcPath
         writeFile destPath contents
         putStrLn "Finished"

这让我感到

GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done. 
[1 of 1] Compiling Main             ( D:\Test.hs, interpreted )

D:\Test.hs:8:22: Not in scope: `contents' 
Failed, modules loaded: none.
Prelude>

我不理解编译器错误,因为变量看起来没问题。错在哪里?
这是一个复现文件:在rapidshare上
2个回答

13

看起来你混淆了制表符和空格(只需查看“编辑”视图中的问题即可看到问题)。虽然你的编辑器将代码视为等距缩进,但编译器似乎对制表符应该有多宽有不同的解释,导致writeFile destPath contents行被额外缩进。因此源代码被解释为:

  ...
  putStrLn ("Copying from " ++ srcPath ++ " to " ++ destPath ++ "...")
  contents <- readFile srcPath writeFile destPath contents
  putStrLn "Finished"

在这份源代码的解释中,contents被使用之前就被创建了,所以你会得到一个编译器错误。

为了避免这种错误最好不要使用制表符,或者至少要额外小心地保证你一直使用它们。


1

看起来没问题。我刚把它粘贴到了一个 .hs 文件中,然后将其加载到了 GHCi 中。这里能够运行,并且我使用的 GHC 版本与您相同。


我已上传我使用的 hs 文件。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接