2012-12-04 1 views
3

J'essaye d'écrire une fonction dans Haskell qui vérifie certaines choses et ensuite récursive en fonction d'une entrée utilisateur minimale. Pour ce faire, je pense que je dois utiliser do blocs.Blocs `do` imbriqués dans Haskell

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() 

Il blesse mes yeux juste en regardant, mais c'est do blocs pour vous. Tout jusqu'à la troisième do bloc est correct. Mais sur cette ligne:

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

Le complier se met à pleurer:

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

essayé toutes sortes de indentations, mais je ne peux pas sembler le faire fonctionner. Je ne veux pas utiliser de fonctions séparées, car cela signifie que je devrai passer beaucoup d'arguments en permanence.

Quelqu'un peut-il m'aider à bien faire les choses? Vous souhaitez obtenir plus d'informations concernant les blocages do qui pourraient vous intéresser?

+2

'if (answer == True)' est la même chose que 'if answer' – amindfv

Répondre

8

La cause de l'erreur Je crois est la mauvaise utilisation de l'expression if . Vous l'utilisez comme s'il s'agissait d'une instruction qui existe dans la plupart des langues impératives. Autrement dit, il doit toujours y avoir un else.

Cependant, dans les blocs, il est logique de "ne pas avoir d'autre", quelque chose comme une instruction if sans autre chose. Heureusement, le module Control.Monad vous fournira une fonction pour exactement cela:

import Control.Monad (when) 

(...) 

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

Vous semblez utiliser déjà imbriqué faire des blocs de manière correcte ce qui est bon, ce qui est essentiellement que vous devez mettre en retrait correctement.

PS. Assurez-vous également que votre dernier return() est indenté comme le reste de votre code! DS.

+1

Bien repéré. Vous aurez besoin de parenthèses autour de 'do' (ou quelque chose d'équivalent, comme' when (choice == "Y") $ do', sinon une excellente réponse –

+0

Correction, merci Daniel! – Tarrasch

Questions connexes