Convertitore di Valuta in ML

Esercizio

Scrivere una funzione convert che riceve come argomento un quantitativo di denaro in una valuta nota e lo converte in una diversa valuta.

Gli argomenti in ingresso sono il quantitativo di denaro da convertire (associato alla sua valuta) e la valuta in cui convertire.

Usiamo delle stringhe (con possibili valori "eur", "usd" e "ounce gold") per rappresentare le valute ed usiamo delle coppie (reale, stringa) per rappresentare quantitativi di denaro in una determinata valuta.

Possibile Soluzione

Possiamo usare dei sinonimi (definiti con type) per stringhe e coppie (reale, stringa) quando le usiamo per indicare valute e quantitativi di denaro:

        type currency = string;
        type money = real * currency;
    

Questa e' una possibile implementazione della funzione convert basata sulle definizioni di currency e money mostrate sopra. Notare che l'idea di usare una stringa per rappresentare la valuta comporta dei problemi (vedere i warning relativi ai pattern non completi). Tale problema puo' essere risolto usando il wildcard pattern "_", ma anche una soluzione di questo tipo puo' essere poco intuitiva (valore ~1 per rappresentare situazioni di errore).

Soluzione Usando datatype

Il problema con le precedenti soluzioni e' che usare una stringa per la valuta non e' una buona idea (permette di specificare valute inesistenti o non supportate). Una soluzione migliore potrebbe consistere nel definire un nuovo tipo di dato per la valuta:

        datatype currency = eur | usd | ounce_gold;
    

Questa implementazione di convert mostra come fare patten matching sul tipo currency appena definito invece che su stringhe.

Ancora con datatype

Analogamente a quanto appena fatto con currency, si puo' usare un nuovo tipo di dato per i quantitativi di denaro in varie valute:

        datatype money = Eur of real | Usd of real | Ounce_gold of real;
    

Questa implementazione di convert mostra come fare patten matching sui tipi appena definiti, mentre questa implementazione mostra come modificare la funzione per ritornare un valore di tipo money invece che una coppia (reale, stringa).