2012-04-09 10 views
5

Ich habe die folgende Codezeile, die, wenn sie mit GHC kompiliert es ohne Probleme geht:Unerwartete Semikolons in bedingten

addRDF c (Just (FILE)) = do 
    (_:file:_) <- getArgs 
    check <- doesFileExist file 
    if check then do rdfG <- TLI.readFile file >>= (return . parseN3fromText) 
        case rdfG of (Left s) -> putStrLn s 
           (Right g) -> storeRDF c g 
    else do putStrLn "Specified files does not exist" 

Aber wenn ich es durch den Kabalen Build-Prozess laufen, gibt sie aus den folgenden Error.

Ich kann das zusätzliche Semikolon im Fehler sehen, aber ich verstehe nicht, woher das kommt.

Hier ist meine Clique Konfigurationsdatei:

cabal-version: >= 1.2 
build-type: Simple 

library 
    build-depends: 
    base, 
    containers, 
    HTTP >= 4000.2.2, 
    directory >= 1.1.0.0, 
    text >= 0.11.1.13, 
    swish >= 0.6.5.2 
    exposed-modules: Repository.Adder, Repository.Configuration 
    ghc-options: -Wall 

executable repository-add 
    main-is: repository-add.hs 
    build-depends: 
    MissingH, 
    swish >= 0.6.5.2, 
    split >= 0.1.4.2 
    ghc-options: -Wall 

UPDATE

korrekten Einzug Mit für if:

addRDF c (Just (FILE)) = do (_:file:_) <- getArgs 
    check <- doesFileExist file 
    if check 
    then do rdfG <- TLI.readFile file >>= (return . parseN3fromText) 
      case rdfG of (Left s) -> putStrLn s 
         (Right g) -> storeRDF c g 
    else do putStrLn "Specified files does not exist" 

ich ein Semikolon nach check jetzt auch bekommen:

Repository/Adder.hs:46:35: 
    Unexpected semi-colons in conditional: 
     if check; then do { rdfG <- TLI.readFile file 
            >>= 
            (return . parseN3fromText); 
          case rdfG of { 
           (Left s) -> putStrLn s 
           (Right g) -> storeRDF c g } }; else do { putStrLn 
                     "Specified files does not exist" } 
    Perhaps you meant to use -XDoAndIfThenElse? 

Antwort

15

Ihr Einzug ist falsch, aber es funktioniert, wenn Sie den rohen GHC-Compiler verwenden, da es automatisch die syntaktische Erweiterung aktiviert, die in der Fehlermeldung (DoAndIfThenElse) erwähnt wird.

In Cabal müssen Sie die Spracherweiterungen angeben, die Sie manuell entweder oben in Ihren Codedateien oder in Ihren Cabal-Dateien verwenden. Andernfalls werden sie vom Compiler nicht aktiviert.

Eine korrekte Version der Einbuchtung für if-Klauseln ist wie folgt:

if check 
    then do 
    rdfG <- TLI.readFile file >>= (return . parseN3fromText) 
    case rdfG of 
     (Left s) -> putStrLn s 
     (Right g) -> storeRDF c g 
    else putStrLn "Specified files does not exist" 

Sie haben den then Teil zu halten und den else Teil bei tiefen Einrückungen als der Block ein Teil sie sind.

+0

Interessant, ich habe an etwas Ähnliches gedacht, aber das Hinzufügen von 'extensions: DoAndIfThenElse' zu ​​meiner Cabal-Datei hatte keinen Effekt. – mhitza

+0

Mein Beitrag wurde aktualisiert, weil das Problem mit dem Einzug nicht gelöst wurde: | – mhitza

+1

@mhitza: Ich glaube, ich habe das If-dann-sonst-Einzug Problem behoben. –