2012-04-09 36 views
5

Tôi có dòng mã sau đây mà khi biên dịch với GHC nó đi mà không có một xô:bất ngờ dấu chấm phẩy trong điều kiện

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" 

Nhưng khi tôi chạy nó thông qua quá trình xây dựng cabal, nó bãi ra như sau lỗi.

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? 

Tôi có thể thấy dấu chấm phẩy bổ sung trong lỗi nhưng tôi không hiểu vị trí đó đến từ đâu.

Dưới đây là tập tin của tôi cabal cấu hình:

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 

CẬP NHẬT

Với thụt đầu dòng chính xác cho 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" 

tôi nhận được một dấu chấm phẩy sau check bây giờ là tốt:

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? 

Trả lời

15

Thụt lề của bạn không đúng, nhưng nó hoạt động khi bạn sử dụng trình biên dịch GHC thô vì nó tự động bật phần mở rộng cú pháp được đề cập trong thông báo lỗi (DoAndIfThenElse).

Trong Cabal, bạn phải chỉ định các tiện ích mở rộng ngôn ngữ mà bạn sử dụng theo cách thủ công, ở đầu tệp mã của bạn hoặc trong các tệp cabal của bạn; nếu không, chúng sẽ không được trình biên dịch kích hoạt.

Một phiên bản đúng của thụt đầu dòng cho if-khoản là như thế này:

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" 

Bạn cần phải giữ cho phần thenelse phần ở mức thụt đầu dòng sâu hơn khối họ là một phần của.

+0

Thú vị, tôi đã nghĩ về điều gì đó tương tự nhưng thêm 'mở rộng: DoAndIfThenElse' vào tệp cabal của tôi không có bất kỳ ảnh hưởng nào. – mhitza

+0

Đã cập nhật bài đăng của tôi vì bản sửa lỗi thụt đầu dòng không giải quyết được sự cố: | – mhitza

+1

@mhitza: Tôi tin rằng tôi đã sửa vấn đề thụt đầu dòng nếu-thì-khác. –

Các vấn đề liên quan