Funzioni di ordine superiore in Ocaml
Il linguaggio Ocaml permette di creare funzioni di ordine superiore. In pratica, funzioni che hanno come argomento il risultato di un'altra funzione.
let nome f g x = f(g(x));;
Dove f e g sono due funzioni qualsiasi mentre x è un valore.
Il compilatore calcola prima la funzione più interna z=g(x) e poi usa il risultato come argomento della funzione più esterna y=f(z)
Nota. In questo esempio ci sono due funzioni ma non c'è limite al numero di funzioni che posso definire in sequenza (tre, quattro, ecc).
Un esempio pratico
In questo script definisco la funzione raddoppia() che calcola il doppio di un numero intero.
Poi definisco una funzione che trova il successivo di un numero intero.
let raddoppia x = x*2;;
let successivo x = x+1;;
lat calcola f g x = f(g(x));;
Infine definisco una funzione di ordine superiore che ha come argomento due funzioni e un valore.
Ora eseguo la funzione calcola
calcola successivo raddoppia 2;;
- : int = 5
Il risultato è 5 perché il compilatore elabora prima la funzione più interna (raddoppia 2=4) e poi usa il risultato (4) come argomento nella funzione più esterna (successivo 4=5).
Se inverto l'ordine delle funzioni il risultato è diverso.
calcola raddoppia successivo 2;;
- : int = 6
Il risultato è 6 perché il compilatore elabora prima la funzione più interna (successivo 2=3) e poi usa il risultato (3) come argomento della funzione più esterna (raddoppia 3=6).
Nota. Il tipo della funzione d'ordine superiore in questo esempio non è conosciuto a priori. Ad esempio, potrei usare la stessa funzione calcola() con funzioni che elaborano una stringa o dei numeri reali. Quindi, il tipo del risultato di una funzione di ordine superiore cambia a seconda dell'utilizzo e non è sempre noto a priori.
E così via.