A fantom típusok egy egyedi típus olyan típusparaméterei, amelyeket a típus egyetlen értékkonstruktora sem használ.
Ez egy kicsit elvont, úgyhogy nézzünk egy példát:
pub type Length(unit) {
Length(amount: Float)
}
Ebben a példában a unit típusparamétert nem használja a Length értékkonstruktor, tehát a unit fantom típus.
Ez a fel nem használt típusparaméter haszontalannak tűnhet, de további megkötéseket tehetünk vele arra nézve, hogyan használhatók a Length értékek.
Például lehet egy double függvényünk, amely megszorozza a hosszt. Bármilyen mértékegységű hosszal működik, ezért a típusparaméter generikus típusváltozó.
// This function accepts all Length values
pub fn double(length: Length(unit)) -> Length(unit) {
Length(length.amount *. 2.0)
}
Lehet egy add_inch függvényünk is, amely csak akkor működik, ha a hossz 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ű hosszt: a fantom típussal értük el, hogy csak a megfelelő mértékegységet lehessen használni.
Írhatunk olyan függvényt is, amely biztosítja, hogy két hosszérték ugyanabban a mértékegységben legyen, ha 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 fantom tí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 érvénytelen mértékegység-típussal ne jöjjenek létre ilyen értékek, és hogy rajtuk csak a fent definiált függvények használhatók.
Lucy online matricaüzletet vezet, ahol aranyos matricákat árul, amelyek mindenki kedvenc programozási nyelvét ábrázolják. A világ minden tájáról vásárolnak tőle matricákat, és meggyűlik a baja a sokféle pénznemmel.
Készíts egy programot, amellyel Lucy ki tudja számítani az árakat, és közben biztos lehet benne, hogy mindig a megfelelő pénznemet használja.
Usd, Eur és Jpy típusokatEzek a típusok arra szolgálnak, hogy képviseljék azokat a különböző pénznemeket, amelyeket Lucy vásárlói a matricák megvásárlásához használnak.
Fantomtípusként kell használni őket, és nem szükséges, hogy konstruktoraik legyenek.
Money típust.A Money típusnak legyen egy Int mezője a pénzösszeghez, egy fantom típusparamétere a pénznemhez, és legyen opaque típus.
dollar, euro és yen függvényeketDefiniáld a dollar, euro és yen függvényeket, amelyek egy Int argumentumot fogadnak, és a megfelelő pénznemű Money értéket adják vissza.
total függvénytDefiniáld a total függvényt, amely egy Money értékekből álló listát vesz át, és visszaadja a lista teljes pénzösszegét.
total([euro(120), euro(200), euro(145)])
// -> euro(465)
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Gleam nyelvet 33 fogalom122 feladat segítségével, valódi emberi mentorálással, mindez ingyen.