---
layout: post
status: publish
published: true
title: Fun with guards
author:
display_name: Siv
login: admin
email: alessandro.sivieri@gmail.com
url: https://launchpad.net/~scattino
author_login: admin
author_email: alessandro.sivieri@gmail.com
author_url: https://launchpad.net/~scattino
excerpt: '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 [...]
'
wordpress_id: 828
wordpress_url: http://www.chimera-bellerofonte.eu/?p=1271
date: '2011-02-05 13:12:09 +0000'
date_gmt: '2011-02-05 12:12:09 +0000'
categories:
- PlanetPOuL
tags: []
comments: []
---
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…