2015-04-06, 12:30
  #1
Medlem
Coopahs avatar
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?
Citera
2015-04-21, 08:46
  #2
Medlem
Nimportequis avatar
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.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in