Espressioni let in Ocaml
Le espressioni let mi permettono di usare una dichiarazione dentro un'espressione nel linguaggio Ocaml. La forma generale è let in.
let [dichiarazione] in [espressione]
La dichiarazione vale solo dentro l'espressione, una volta terminata cessa di esistere.
Per questa ragione le espressioni let sono anche dette dichiarazioni locali.
Nota. Sono dette "dichiarazioni" perché usano il comando let, normalmente usato per dichiarare qualcosa.
Un esempio pratico
Apro il terminale di Ocaml e dichiaro la variabile year
let year=2020;;
Poi creo una dichiarazione locale
let year=2019 in ( if year mod 2=0 then "pari" else "dispari" )
Il risultato della dichiarazione locale è il valore "dispari" di tipo string
- : string = "dispari"
Se ora interrogo la variabile year
year;;
il risultato è il precedente ossia il valore 2020 di tipo int
- : int = 2020
Da notare che nelle espressioni locali non solo il valore della variabile è diverso ma anche il tipo.
A cosa servono le dichiarazioni locali
Le dichiarazioni locali mi permettono di richiamare delle funzioni ausiliarie senza sovraccaricare la memoria del programma.
In genere sono usate
- nelle espressioni in cui una funzione viene richiamata più volte con lo stesso valore.
- per semplificare la sintassi di una struttura dati se è troppo complessa.
- per definire funzioni locali o funzioni usate una sola volta in un determinato contesto
Esempio 1
In questa espressione calcolo il prodotto della funzione fattoriale di 100 per se stessa.
fattoriale(100)*fattoriale(100)
Il compilatore esegue la funzione fattoriale(100) per due volte. Poi calcola il prodotto dei fattoriali.
Usando la tecnica della dichiarazione locale posso scrivere
let x=fattoriale(100) in (x*x)
In questo caso il compilatore esegue la funzione fattoriale(100) una sola volta, assegna il risultato alla variabile locale x e calcola il prodotto nell'espressione x*x.
Il risultato finale è lo stesso ma la complessità temporale è minore.
Nota. Il compilatore esegue il comando in minore tempo perché esegue una sola volta la funzione fattoriale(100).
Esempio 2
In questo esempio riscrivo la funzione precedente facendo in modo che funzioni per tutti i numeri interi
let quadratofattoriale(n) = let x=fattoriale(n) in x*x;;
La funzione quadratofattoriale(n) è definita nello spazio di memoria principale e accetta in entrata un parametro intero n.
L'espressione let in, invece, vive in memoria soltanto per il tempo della sua esecuzione.
Ad esempio
quadratofattoriale(3);;
restituisce come risultato
- : int = 36
La stessa funzione posso usarla con qualsiasi altro intero
quadratofattoriale(4);;
restituisce in output
- : int = 576
E così via.
