Haskell 条件语句中意外的分号
我有以下代码行,当使用GHC编译时,它会顺利运行: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
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"