Haskell编译器错误:不在范围内

时间:2009-11-07 19:14:30

标签: haskell

我正在尝试通过编写一个简单的文件副本util来学习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>

我不明白编译器错误,因为变量似乎没问题。有什么问题?

这是一个repro文件:at rapidshare

2 个答案:

答案 0 :(得分:13)

看起来您混合了标签和空格(只需在“编辑”视图中查看您的问题即可查看问题)。当编辑器以均匀的方式查看代码时,编译器似乎对选项卡的宽度有不同的解释,导致writeFile destPath contents行另外缩进。所以源代码解释如下:

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

在源代码contents的这种解释中,在创建之前使用它,因此会出现编译器错误。

为避免出现这类错误,最好不要使用标签,或者至少要小心谨慎地使用标签。

答案 1 :(得分:1)

看起来很正确。我只是将其粘贴到.hs文件中并将其加载到GHCi中。在这里工作,我有与你相同的GHC版本。