2012-04-09 1 views
5

У меня есть следующие строки кода, который при компиляции с GHC она идет без сучка и задоринки:Неожиданные с запятой в условном

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" 

Но когда я запускаю его через Кабал процесса сборки, он сваливает из следующих ошибка.

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? 

Я вижу дополнительную точку с запятой в ошибке, но я не понимаю, откуда она взялась.

Вот мой файл междусобойчик конфигурации:

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

При правильном отступа 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" 

я точка с запятой после check и сейчас:

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? 

ответ

15

Ваш отступ неправильный, но он работает, когда вы используете компилятор необработанных GHC, потому что он автоматически включает расширение синтаксиса, указанное в сообщении об ошибке (DoAndIfThenElse).

В Cabal вы должны указать языковые расширения, которые вы используете вручную, либо в верхней части файлов кода, либо в ваших файлах Cabal; в противном случае они не будут включены компилятором.

Один правильный вариант отступа для if-положений, как это:

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" 

Вы должны держать then часть и else часть на более глубоких уровней отступа, чем блок они часть.

+0

Интересно, я подумал о чем-то подобном, но добавление 'extensions: DoAndIfThenElse' в мой файл кэша не оказало никакого эффекта. – mhitza

+0

Обновлено мое сообщение, потому что исправление отступов не решило проблему: | – mhitza

+1

@mhitza: Я считаю, что исправил проблему с отступом if-then-else. –

 Смежные вопросы

  • Нет связанных вопросов^_^