Haskell 条件语句中意外的分号

Haskell 条件语句中意外的分号,haskell,cabal,Haskell,Cabal,我有以下代码行,当使用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) -> pu

我有以下代码行,当使用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"
更新

如果
,则使用正确的缩进:

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"

缩进是不正确的,但当您使用原始GHC编译器时它会工作,因为它会自动打开错误消息中提到的语法扩展(
doAndifthenels

在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"
if检查
那就做吧
rdfG>=(return.parseN3fromText)
案例rdfG
(左s)->putStrLn s
(右g)->storeRDF c g
else putStrLn“指定的文件不存在”

您必须将
然后
部分和
其他
部分保持在比它们所属的块更深的缩进级别。

,我也想到过类似的事情,但在我的阴谋文件中添加
扩展名:DoAndIfThenElse
没有任何效果。更新了我的帖子,因为缩进修复没有解决问题:|@mhiza:我相信我已经纠正了if-then-else缩进问题。@mhiza您在这两个文件中都添加了
扩展名:DoAndIfThenElse
指令了吗您的
可执行文件
块?由于阴谋集团的故意行为(可能令人惊讶),您的可执行文件没有使用库中的
存储库.Adder
模块,而是使用原始源代码。@DanielWagner有趣的是,有时空白语法会让您措手不及(特别是对于来自shell函数式风格的人,其中构造在同一行上有
if
then
)关于你的问题:没有,我没有,我只是将它添加到
块中,它与可执行块没有任何关系,这似乎不直观(因为呼叫方向相反)。
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?
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"