Citat:
Ursprungligen postat av
Coopah
Jag vill skapa partiella funktioner i SML som tillåter värden av samma sort och dimension att adderas och multipliceras, hittils har jag följande:
datatype temp_dimension = Celsius | Fahrenheit;
datatype dist_dimension = Meters | Centimeters | Kilometers;
datatype units = Temp of temp_dimension | Distance of dist_dimension;
type value = (real * units);
fun add (x1, y1) (x2, y2) = ((x1 + x2) + y2)) add Temp(Celsius);
fun mul (x1, y1) (x2, y2) = ((x1 * x2) + y2);
Jag behöver inte alla sorter, bara de som är vettiga, till exempel behöver jag inte kunna multiplicera temperaturer. Jag ska kunna skriva följande:
add ((3.5, Temp (Celsius)), (4.5, Temp (Celsius)))
=> (8.0, Temp (Celsius))
mul ((2.0, Distance (Meters)), (3.0, Distance (Meters)))
=> (6.0, Distance (Meters))
Jag behöver också kunna inkludera enhetsförvandlingar. Till exempel att få centimeter till meter, exempelvis:
add ((2.0, Distance (Meters)), (3.0, Distance (Centimetres)))
=> (2.03, Distance (Meters))
Någon som kan hjälpa mig?
Jag vill brasklappa att jag inte använt SML på ett tag, men så här hade jag gjort:
Givet de datatyper du definierar kan vi börja definiera add enligt följande:
Kod:
fun add (x1:real, Temp(Celsius)) (x2:real, Temp(Celsius)) = (x1+x2, Temp(Celsius))
| add (x1:real, Temp(Fahrenheit)) (x2:real, Temp(Fahrenheit)) = (x1+x2, Temp(Fahrenheit));
vilket kan ge:
Kod:
> add (1.0, Temp(Celsius)) (2.0, Temp(Celsius));
val it = (3.0, Temp Celsius): real * units
Sedan definierar du liknande för avstånd. Det är inte självklart vilken enhet addition av sträckor ska vara. Antingen definierar du add för alla 8 par av två avståndsenheter, eller så skapar du en funktion som byter allt till en given enhet innan du adderar.