È un superlinguaggio del linguaggio Exp. La sua grammatica contiene tutti i suoi elementi e le funzioni unarie.

è l’applicazione.

L’applicazione di funzione è associativa a sinistra: ad esempio vuol dire passato a applicato a . Cioè se avessimo , dovremmo passare (la funzione successore) come oggetto a (la funzione identità). Otteniamo applicato a , quindi restituisce .

Dobbiamo cambiare il dominio semantico di rispetto a com’era in Exp.

Il problema di è così definito si può applicare un intero a un altro intero, non solo funzioni, ad esempio (5 applicato a 7, non 57). Oppure (funzione applicata a un intero) che è sintatticamente ben costruito ma non ha senso. La semantica operazionale non potrà dargli un valore, perché l’albero di derivazione si bloccherà. Serve la ŧeoria dei tipi per risolvere parzialmente questo problema, ma per ora siamo in un universo non tipato.

Esempi:



Possiamo creare funzioni binarie con la curryficazione componendo funzioni unarie.

Il curry di una funzione è da a e la uncurryficazione è il contrario.


Bisogna cambiare l’insieme :

I valori funzionali saranno triple definite chiusure: variabile, elemento del linguaggio (pezzo di sintassi) e ambiente.

Regole di inferenza aumentate: (eager statica)

Call by value

Let non serve più

All’estremo, si può fare a meno del + e a meno dei numeri, usando i numeri di Church. Si ottiene il lambda calculus.


todo

in eager va in loop infinito (effetto computazionale che introducono le funzioni) e non da un valore, mentre in lazy.


let x = M in N è operazionalmente equivalente () a (fn x -> N)M in un mondo non tipato, dove in let x = M in N possiamo avere il polimorfismo, mentre in (fn x -> N)M no.