Haskell中嵌套的`do`块

时间:2012-12-04 00:43:42

标签: haskell

我正在尝试在Haskell中编写一个函数,它检查一些事情,然后根据一些最小的用户输入进行递归。为了做到这一点,我想我必须使用do块。

cip :: [Argument] -> [Argument] -> Bool -> Bool -> IO()
cip (a:args) pargs burden gameover = do
    let nasko = a:pargs
    putStrLn (getPremise a)
    let newgraph = Carneades.mkArgGraph nasko
    let newcaes = (CAES (newgraph,audience2,assStandarts)) 
    let answer = (acceptable (mkProp (getPremise a)) newcaes )
    print answer
    if(answer==True) 
    then (cip args nasko burden gameover) 
    else do
        print "One of the arguments is not proved. Here are the premises that need proving"
        print (propsForFixing newcaes a)
        print "Let's see what you have for the first Propositon"
        --add an if to check if no applicable arguments.
        print (argumentScanHelp (head (propsForFixing newcaes a)) args)
        print "\n Would you like me to apply the firt one? Y/N"
        choice <- getLine
        if(choice=="Y") then do print "applying the argument"
                                let applicabee = head (argumentScanHelp (head (propsForFixing newcaes a)) args)
                                print "Argument targeted"
                                let newargs = delete applicabee args
                                let newpargs = applicabee:nasko
                                print "Argument applied sucsessfuly. Recusing again"
                                (cip newargs newpargs burden gameover)
return()

只要看着它就会伤到我的眼睛,但那是do阻挡你。 直到第三个do块的所有内容都可以。但接下来就是这条线:

        if(choice=="Y") then do print "applying the argument"
                                let applicabee = head (argumentScanHelp (head (propsForFixing newcaes a)) args)

编辑开始哭泣:

Main.hs:209:73: parse error on input `let'

尝试了各种不同的缩进,但我似乎无法让它工作。 我不想使用单独的函数,因为这意味着我将不得不经常传递大量的论据。

任何人都可以帮助我做对吗?还将非常感谢对嵌套do块的具体规范的解释。

1 个答案:

答案 0 :(得分:8)

我认为错误的原因是滥用if 表达式。您可以像使用大多数命令式语言中的if 语句一样使用它。简单地说,必须始终有一个else

然而,在do块中,“没有其他”是有意义的,就像没有else的if语句一样。幸运的是,Control.Monad模块将为您提供完全相同的功能:

import Control.Monad (when)

(...)

when (choice=="Y") $ do print "applying the argument"
                        let applicabee = ...

您似乎已经以正确的方式使用嵌套的do块,这很好,基本上您必须正确缩进。

PS。还要确保您的上一个return ()与其他代码一样缩进! DS。