giovedì 29 dicembre 2011

F# - Costrutto if e pattern matching

Il più delle volte, quando si scrive un programma si ricorre all'utilizzo di costrutti condizionali, che permettono di scegliere le istruzioni da eseguire in base ad un valore o al risultato di un confronto. Ciò è possibile grazie ai costrutti if, presente in tutti i linguaggi di programmazione e di pattern matching

Il costrutto if

Come accennato prima, questo costrutto permette di far eseguire un'istruzione, oppure l'altra in base alla condizione imposta dopo la parola chiave if. Vediamo un esempio di come viene impiegato questo costrutto:

if a>b then a-b else b-a;;

Se proviamo a tradurre letteralmente in italiano, otteniamo la seguente frase: se a>b allora restituisci a-b, altrimenti restituisci b-a. In altre parole quando la condizione restituisce true, allora eseguiamo l'istruzione del ramo then, altrimenti eseguiamo l'istruzione del ramo else.
Se, per esempio, vogliamo restituire il massimo tra due numeri, allora possiamo fare in questo modo:

if a>b then a else b;;

letteralmente, se a è maggiore di b allora restituisci a, altrimenti restituisci b. Quindi se vogliamo scrivere una funzione max, che restituisce il massimo degli argomenti passati in input, avremo:

let max a b =
    if a>b then a
    else b;;


I pattern matching

I pattern matching sono sostanzialmente dei costrutti condizionali, che confrontano un valore con gli altri, che rappresentano i suoi rami, e una volta trovata la corrispondenza, esegue l'istruzione corrispondente. Volendo si potrebbe anche evitare l'utilizzo di tale costrutto, però il codice diventerebbe meno chiaro, perché saremmo costretti ad usare dei costrutti if annidati (una soluzione poco elegante e poco chiara). Ma vediamo come si utilizzano i pattern matching:

match valore with
corrispondenza1 -> istruzione
| corrispondenza2 -> istruzione
| _ -> istruzione_default;;

In pratica in questo modo confrontiamo valore con le corrispondenze e una volta trovata la corrispondenza eseguiamo l'istruzione scritta dopo ->, inoltre ogni corrispondenza deve essere separata dalle altre tramite il simbolo |. Qualcuno avrà notato che come ultima corrispondenza è stato messo il simbolo _, che in F# indica qualunque cosa e in questo caso sta per tutti gli altri casi e viene usato quando non vogliamo definire tutti i possibili casi. Dobbiamo, inoltre, tenere a mente che le corrispondenze vengono processate nel ordine scritto nel pattern matching e una volta trovata la corrispondenza, vengono ignorate tutte le altre.
L'utilizzo più approfondito di questo costrutto verrà spiegato assieme alle funzioni ricorsive, dove molto spesso viene preferito l'utilizzo di questo costrutto, invece del costrutto if

Nessun commento:

Posta un commento