2009-11-07 40 views
3

我試圖通過編寫一個簡單的文件複製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> 

我不明白,編譯器錯誤,因爲該變量似乎是確定的。哪裏不對?

這裏是一個攝製文件:at rapidshare

回答

13

它看起來像是混合了製表符和空格(只需在「編輯」視圖中查看您的問題即可查看問題)。當編輯器以均勻縮進的方式查看代碼時,編譯器似乎對選項卡的寬度應有不同的解釋,導致writeFile destPath contents行被額外縮進。因此源這樣解釋:

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

在此解釋的源代碼contents的創建之前使用它,所以你得到一個編譯錯誤。

爲了避免這些錯誤,最好不要使用製表符,或者至少要格外小心您一直使用它們。

1

這看起來是正確的。我只是將它粘貼到一個.hs文件中,並將其加載到GHCi中。在這裏工作,我有和你一樣的GHC版本。

+0

我上傳了我使用的hs文件。 – usr 2009-11-07 19:22:45