2009-11-07 5 views
3

Je suis en train d'apprendre haskell en écrivant une simple copie de fichier util:erreur du compilateur Haskell: non portée

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

Cela me obtient

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> 

Je ne comprends pas cette erreur du compilateur car la variable semble être ok. Qu'est-ce qui ne va pas?

Voici un fichier repro: at rapidshare

Répondre

13

Il semble que vous ayez mélangé des onglets et des espaces (il suffit de regarder votre question dans la vue "modifier" pour voir le problème). Bien que votre éditeur considère que le code est uniformément indenté, le compilateur semble avoir une interprétation différente de la largeur d'un onglet, ce qui entraîne la mise en retrait supplémentaire de la ligne writeFile destPath contents. Ainsi, la source est interprétée comme ceci:

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

Dans cette interprétation du code source contents est utilisé avant qu'il ne soit créé, vous obtenez une erreur du compilateur.

Pour éviter ce type d'erreur, n'utilisez pas d'onglets au minimum, ou prenez au moins un soin particulier pour les utiliser de manière cohérente.

1

Cela semble correct. Je l'ai juste collé dans un fichier .hs et: chargé dans GHCi. Fonctionne ici et j'ai la même version de GHC que vous.

+0

J'ai téléchargé le fichier hs que j'utilise. – usr