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…