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.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    Le funzioni in Ocaml