2014-11-08 9 views
6

Ho questa funzione "percorso" che prende 3 argomenti:Come scrivere annidato se le istruzioni in haskell?

path::String->String->String->IO() 
path place1 dir place2 = 
    if place1 == "bedroom" && d == 'n' && place2 == "den" 
    then do 
     putStrLn "You are in a bedroom with a large, comfortable bed. It has been a long, tiresome day, and you would like nothing better than to go to sleep." 
    else 
    if place1 == "bedroom" && d == 'd' && place2 == "bed" 
     then describe "bed" 
    else 
     if place1 == "den" && d == 's' && place2 == "bedroom" 
     then describe "bedroom" 
     else 
     if place1 == "bed" && d == 'u' && place2 == "bedroom" 
      then describe "bedroom" 
     else putStrLn "Cannot go there!" 

Voglio sapere come se questo è il modo corretto di avere più condizioni e multiplo se dichiarazioni?

+0

BTW, esso sarebbe probabilmente una buona idea cambiare il tipo del secondo argomento in modo qualcosa di più significativo di 'Char' o' String'. – leftaroundabout

risposta

12

Non è errato, ma non è idiomatica (vale a dire lo stile consueto). Di solito preferiamo le guardie a if-then-else, come nella risposta di @ user5402. Tuttavia nel suo caso si sono anche solo confrontando per letterali costanti con ==, il che significa che il modo migliore è quello di prendere un ulteriore passo avanti e utilizzare il pattern matching (ho formattato un po 'più carina troppo):

path :: String -> String -> String -> IO() 
path "bedroom" "n" "den"  = putStrLn "You are in a bedroom with a large, comfortable bed. It has been a long, tiresome day, and you would like nothing better than to go to sleep." 
path "bedroom" "d" "bed"  = describe "bed" 
path "den"  "s" "bedroom" = describe "bedroom" 
path "bed"  "u" "bedroom" = describe "bedroom" 
path _   _ _   = putStrLn "Cannot go there!" 
+0

Sì, questo è un buon idioma da sapere. – ErikR

3

considerare l'utilizzo di guardie, per es .:

path :: String -> String -> String -> IO() 
path place1 d place2 
     | place1 == "bedroom" && d == "n" && place2 == "den" 
     = putStrLn "You are in a bedroom ..." 
     | place1 == "bedroom" && d == "d" && place2 == "bed" 
     = describe "bed" 
     | place1 == "den" && d == "s" && place2 == "bedroom" 
     = describe "bedroom" 
     | place1 == "bed" && d == "u" && place2 == "bedroom" 
     = describe "bedroom" 
     | otherwise = putStrLn "Cannot go there!" 

noti che String letterali un racchiusi tra doppi apici.

Problemi correlati