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.
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).
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.
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).