我正在尝试通过编写一个简单的文件副本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
答案 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版本。