2014-12-15 8 views
7

Sto scrivendo un semplice programma in Haskell, e hanno la seguente funzione:multilinea if Haskell

tryMove board player die = do 
    let moves = getMoves board player die 
    putStrLn ("Possible columns to move: " ++ (show $ moves)) 

    if not $ null moves then 
    let col = getOkInput $ moves 
    putStrLn " " 
    return $ step board (getMarker player) col firstDie 
    else 
    putStrLn ("No possible move using "++(show die)++"!") 
    return board 

ci vuole un consiglio, e se un giocatore può fare una mossa basata su un tiro di dado, il nuovo la scheda viene restituita, altrimenti viene restituita la vecchia scheda.

Tuttavia, haskell non mi consente di utilizzare più righe nella mia istruzione if. È possibile usare qualche tipo di limitatore in modo che io possa usare cose come let in un if?

+2

Stile: ' "Possibili colonne di muoversi:" ++ (spettacolo $ si muove)' può essere semplificata a ' "Possibili colonne di muoversi:" ++ mostrare moves'. Non usare '$' quando c'è una singola variabile alla sua destra: è ridondante. – chi

+0

@chi: Grazie! Avrebbe dovuto usare hlint prima di pubblicare;) – Pphoenix

risposta

12

È necessario ripetere la parola chiave do su ogni ramo then/else.

whatever = do 
    step1 
    step2 
    if foo 
    then do 
     thing1 
     thing2 
     thing3 
    else do 
     thing5 
     thing6 
     thing7 
     thing8 
+3

È necessario aggiungere il motivo per cui è necessario. – bheklilr

+2

@bheklilr AFAIK, è necessario "perché le specifiche della lingua lo dicono". – MathematicalOrchid

+2

Direi che è più perché ogni clausola di un 'if-then-else' deve essere un costrutto valido (con scope) e' thing1; cosa2; thing3' non è un costrutto valido, ma 'do thing1; cosa2; cosa3 è. – bheklilr