2014-05-05 20 views
5

Ho il seguente codice e ho già provato diversi modi per scrivere questo, ma non riesco a farlo funzionare. Quello di cui ho bisogno è usare una condizione if all'interno di un blocco do.Errore di analisi sull'ingresso 'if' quando si tenta di utilizzare una condizione all'interno di un blocco

Ho modificato la condizione in true solo per renderlo più semplice. Ho provato ad aggiungere la frase else, ma ottengo lo stesso.

+2

Se non lo fai vuoi fare qualcosa nel resto, quindi dovresti usare 'when'. – pat

risposta

11

In Haskell, un'espressione if-else non significa "se è vero, esegue foo, altrimenti esegue la barra", ma "se è vero, il valore è foo, altrimenti il ​​valore è bar". Per questo motivo, non è possibile omettere lo else, in modo simile a quando non si utilizza l'operatore ternario se (conditon ? foo : bar) in altre lingue. Nel tuo caso, la parte then è un valore di tipo IO(), quindi è necessario un else con lo stesso tipo. Come non si desidera antyhing accadere in realtà se la condizione è falsa, la soluzione più immediata utilizza il valore fittizio IO(), return():

palin :: IO() 
palin 
    = do line <- getLine 
     putStr line 
     if True 
     then putStr line 
     else return() 

È anche possibile utilizzare la funzione when da Control.Monad, che ha lo stesso effetto :

import Control.Monad 

palin :: IO() 
palin 
    = do line <- getLine 
     putStr line 
     when True (putStr line) 
+0

Grazie! spiegazione perfetta! – DemianArdus

2

Ti manca un altro.

palin :: IO() 
palin = do 
    line <- getLine 
    putStr line --Probably better to use putStrLn? 
    if True then putStr line else putStr "hi" --Also consider putStrLn here? 

è necessario fornire un valore, se arrivate da Python, poi pensare a qualcosa di simile a

a = "dogs" if 1 < 0 else "cats" qui, è necessario fornire l'altro, come senza di essa l'assegnazione variabile non sarebbe correre.

2

In Haskell tutto dopo = è espressione, e le espressioni di solito hanno valori. Anche l'istruzione condizionale è espressione così come putStr "hi" e hanno i loro valori (di ritorno). Nel caso di if il valore di ritorno è il valore del ramo corrispondente (allora o altro). In caso di putStr "hi" è un po 'più coinvolto, non voglio spiegare qui (vedi IO e monadi)

Quindi il modo corretto di scrivere il codice sarebbe il seguente:

palin :: IO() 
palin = do line <- getLine 
      if True 
      then putStr line 
      else return() 
      -- this return has nothing to do with return in python 
      -- basically it means "do nothing" 
Problemi correlati