2011-02-06 12 views
5

Sono abbastanza nuovo a Haskell, ma se fate un'istruzione if:Haskell IF

function a b c 
    | (a+b == 0) = True 
    | --etc. 
    | otherwise = False 

è la seconda istruzione if la stessa di un altro, se in altre lingue, o è solo un altro se . Presumo che sia il primo in quanto si può avere solo un output, ma voglio essere sicuro.

+0

Sì, la tua linea di ragionamento era sulla strada giusta. Cosa significherebbe avere più di una parte destra "eseguita"? Non ci sono effetti collaterali, quindi tutto ciò che "facciamo" dobbiamo tornare. Quale valore vorremmo restituire? O dovremmo avere un modo per combinarli ... quale modo utilizzeremmo? (Solo alcune domande per guidarti alla filosofia di Haskell) – luqui

risposta

9

Il costrutto che hai usato è chiamato guardia. Haskell verifica le alternative date una dopo l'altra finché una condizione non produce True. Quindi valuta il lato destro di tale equazione.

Si potrebbe scrivere molto bene

function n 
    | n == 1 = ... 
    | n == 2 = ... 
    | n >= 3 = ... 

così i tipi di guardia di rappresenta un if/elseif costruire da altre lingue. Come otherwise è semplicemente definito come True, l'ultimo

| otherwise = 

saranno sempre vere e rappresenta quindi un catch-all else clausola.

Tuttavia, Haskell ha una normale dichiarazione a = if foo then 23 else 42.

+0

Ha senso, accetterà quando SO mi consente. Grazie! – switz

+2

Si noti che in Haskell, la parte 'else' delle istruzioni' if' è obbligatoria. Vedi [Haskell 2010: Conditionals] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-320003.6).E poi c'è ["when" e "unless"] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:when) –

1

Deve essere come un altro se.

Il modello di fondo otherwise è in realtà solo True, quindi se la prima partita non ha vinto, si otterrebbe sempre il valore più specifico e il valore altrimenti.

2

Quello che hai qui non è davvero un'affermazione, ma piuttosto una guardia. Ma hai ragione che il secondo caso viene "eseguito" solo se i casi precedenti (per i casi qui intendo le espressioni tra lo | e lo =) non corrispondono (valuta a True). otherwise è solo una sinonimo di True (in questo modo sempre "corrisponde").

1

Corretto. Sebbene tu abbia usato le guardie, il modo in cui l'hai espresso è più o meno identico all'utilizzo di un'istruzione if. Il flusso di testare il condizionale per ottenere un risultato cadrà attraverso la guardia che hai scritto nell'ordine in cui sono stati elencati nella tua guardia.

(a+b == 0) 

saranno controllati prima

etc. 

saranno controllati secondo e così via, purché non precede condizionale è vero.

otherwise 

Sarà controllato per ultimo, a condizione che nessun condizionale precedente sia vero.