Kurzusok
/
Gleam
Gleam
/
Tanterv
/
Fantomtípusok
Fa

Fantomtípusok ebben a kurzusban: Gleam

1 feladat

A(z) Fantomtípusok fogalomról

A fantomtípusok egy egyedi típus olyan típusparaméterei, amelyeket a típus egyetlen értékkonstruktora sem használ.

Ez kicsit elvont, ezért nézzünk egy példát:

pub type Length(unit) {
  Length(amount: Float)
}

Ebben a példában a unit típusparamétert a Length értékkonstruktor nem használja, így a unit fantomtípus.

Ez a fel nem használt típusparaméter feleslegesnek tűnhet, de arra használhatjuk, hogy további megkötéseket szabjunk vele a Length értékek használatára.

Például lehet egy double függvényünk, amely megszorozza a hosszúságot. Bármilyen mértékegységű hosszúsággal működik, ezért a típusparaméter egy generikus típusváltozó.

// This function accepts all Length values
pub fn double(length: Length(unit)) -> Length(unit) {
  Length(length.amount *. 2.0)
}

Készíthetünk egy add_inch függvényt is, amely csak akkor működik, ha a hosszúság hüvelykben van.

// A unit type for inches. It is never constructed so we don't
// define any constructors for it.
pub type Inches

pub fn add_inch(length: Length(Inches)) -> Length(Inches) {
  Length(length.amount +. 1.0)
}

Az add_inch függvény nem fogad el más mértékegység-paraméterű hosszúságot: a fantomtípussal értük el, hogy csak a megfelelő mértékegység használható.

Írhatunk olyan függvényt is, amely biztosítja, hogy két hosszúságérték ugyanabban a mértékegységben legyen, ehhez mindkettőhöz ugyanazt a típusváltozót használjuk.

pub fn add(a: Length(unit), b: Length(unit)) -> Length(unit) {
  Length(a.amount +. b.amount)
}
let two_meters: Length(Meters) = Length(2.0)
let two_inches: Length(Inches) = Length(2.0)

add(two_meters, two_meters)
// -> Length(4.0): Length(Meters)

add(two_meters, two_inches)
// Type error! The unit type parameters do not match.

A fantomtípusok jól működnek együtt az opaque típusokkal. Ha más modulok nem tudnak Length értéket létrehozni, akkor biztosíthatjuk, hogy ne érvénytelen mértékegység-típussal jöjjenek létre, és hogy csak a fent definiált függvények használhatók velük.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Fantomtípusok fogalmat