Fun with guards

February 05, 2011 | 2 Minute Read

Un breve post per introdurre una caratteristica di Erlang che non viene spiegata in modo così chiaro: le guards per le funzioni lambda (o fun nel linguaggio in questione).

Ordunque: anche Erlang ha la possibilità di filtrare gli input di una funzione utilizzando alcune funzioni predefinite; questo permette di evitare l’uso di condizionali, che peraltro non sono il massimo dell’usabilità in un linguaggio del genere.

Qualunque manuale vi mostrerà, ad esempio, un listato come il seguente:

abs(Number) when Number < 0 ->
    -Number;
abs(Number) ->
    Number.

Questo è un banale esempio di una funzione che calcola il valore assoluto di un numero: quando questo è minore di zero, viene ritornato il suo opposto, in caso contrario viene ritornato il numero stesso.

E fin qui, tutto bene. La questione è: è possibile filtrare anche nelle lambda allo stesso modo? E la risposta è sì, anche se la sintassi non è proprio chiarissima e soprattutto non è segnata nei manuali; ad esempio, riprendendo l’esempio di prima:

abs(List) when is_list(List) ->
    lists:map(fun(Element) when Element < 0 ->
                     -Element;
                 (Element) ->
                     Element end, List).

In questo caso, il filtraggio avviene esattamente come prima, in una funzione che prende in input una lista di numeri e ne restituisce una versione con i valori assoluti di ciascun valore. Da notare la sintassi per applicare le guards nella lambda interna alla map: bisogna ripetere i parametri della funzione, parentesi comprese, ma senza ripetere la dichiarazione fun.

E’ una caratteristica che cercavo da tempo, ed ora finalmente ho scoperto come si applica…