2010-08-16 16 views
6

Ecco un esempio che ho scritto che utilizza i rami if-else e le espressioni di guardia. Quando è più appropriato rispetto all'altro? La ragione principale per cui voglio sapere questo è perché le lingue hanno tipicamente un modo idiomatico di fare le cose.Quando sono appropriate le espressioni di guardia?

test1 a b = 
    if mod b 3 ≡ 0 then a + b 
    else if mod b 5 ≡ 0 then a + b 
    else a 

test2 a b 
    | mod b 3 ≡ 0 = a + b 
    | mod b 5 ≡ 0 = a + b 
    | otherwise = a 

risposta

11

L'esempio che fornisci è un'ottima dimostrazione di come le guardie sono migliori.

Con le guardie, si dispone di un elenco molto semplice e leggibile di condizioni e risultati - molto vicino a come la funzione sarebbe stata scritta da un matematico.

Con if, d'altra parte, si ha un po 'complicato (essenzialmente O (n) difficoltà di lettura) la struttura di espressioni nidificate con le parole chiavi gettato in a intervalli irregolari.

Per casi semplici, è fondamentalmente un rigetto tra if e guardie - if potrebbe anche essere più leggibile in alcuni casi molto semplici perché è più facile scrivere su una singola riga. Per una logica più complicata, tuttavia, le guardie sono un modo molto migliore di esprimere la stessa idea.

+0

+1 per, oltre ad avere ragione, "O (n²) difficoltà di lettura" – delnan

+0

@delnan - Forse stavano pensando * "O (n²) segnale rumore al rapporto" * con 'n' è il numero di condizioni. – ChaosPandion

6

Ho sempre pensato che fosse una questione di preferenza. Personalmente, preferisco il secondo, penso che gli ifls diano un tocco più imperativo rispetto alle guardie, e trovo le guardie più facili da leggere.

+2

Mi piace davvero il modo in cui le guardie leggono. – ChaosPandion

Problemi correlati