Esercizio

Si consideri il tipo di dato

datatype intonil = Nil | Int of int
ed una possibile implementazione semplificata di ambiente (che considera solo valori interi) basata su di esso:
type ambiente = string -> intonil

In questa implementazione, un ambiente e' rappresentato da una funzione che mappa nomi (valori di tipo string) in valori di tipo intonil (che rappresentano un intero o nessun valore). Tale funzione applicata ad un nome ritorna il valore intero ad esso associato oppure Nil.

Usando questa convenzione, l'ambiente vuoto (in cui nessun nome e' associato a valori) puo' essere definito come:

val ambientevuoto = fn _:string => Nil;

Basandosi su queste definizioni, si definisca una funzione "lega" con tipo "ambiente -> string -> int -> ambiente". che a partire da un ambiente (primo argomento) genera un nuovo ambiente (valore di ritorno) uguale al primo argomento piu' un legame fra il nome e l'intero ricevuti come secondo e terzo argomento.

IMPORTANTE: notare il tipo della funzione! (si noti che utilizza la tecnica del currying).

A titolo di esempio:

La funzione lega deve essere definita in un file .sml autocontenuto ma separato da qualsiasi codice di test si sia usato. Non e' necessario che contenga la definizione del tipo di dato intonil, di ambiente o del valore ambientevuoto. Si consegni il file .sml contenente la definizione di lega.

Possibile Soluzione

Questa e' una possibile soluzione.