2012-04-09 8 views
5

tengo la siguiente línea de código que cuando se compila con GHC va a pedir de boca:inesperados puntos y comas en condicional

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" 

Pero cuando corro a través del proceso de construcción Cabal, que vuelca el siguiente error.

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? 

Puedo ver el punto y coma adicional en el error, pero no entiendo de dónde viene eso.

Aquí es mi cábala fichero de configuración:

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 

ACTUALIZACIÓN

Con muesca correcta para 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" 

consigo un punto y coma después check ahora así:

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? 

Respuesta

15

Su sangría es incorrecta, pero funciona cuando utiliza el compilador GHC sin procesar porque activa automáticamente la extensión sintáctica mencionada en el mensaje de error (DoAndIfThenElse).

En Cabal, tiene que especificar las extensiones de idioma que usa manualmente, ya sea en la parte superior de los archivos de código o en los archivos Cabal; de lo contrario, no serán habilitados por el compilador.

Una versión correcta de la sangría para IF-cláusulas es así:

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" 

usted tiene que mantener la parte then y la parte else en niveles de sangría más profundas que el bloque que son una parte de.

+0

Interesante, he pensado en algo similar, pero agregar 'extensiones: DoAndIfThenElse' a mi archivo cabal no tuvo ningún efecto. – mhitza

+0

Actualicé mi publicación porque la corrección de sangría no resolvió el problema: | – mhitza

+1

@mhitza: Creo que he corregido el problema de la indentación if-then-else. –

Cuestiones relacionadas