A Gleam opaque típusai olyan egyedi típusok, amelyeknél csak az a modul tud ilyen típusú értékeket létrehozni vagy rájuk mintát illeszteni, amelyik magát a típust definiálja. Ez akkor hasznos, ha olyan típust szeretnénk létrehozni, amelyet csak egy meghatározott módon lehet használni.
Az opaque típusokat az opaque kulcsszóval definiáljuk.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Ezt a PositiveInt típust olyan helyzetekben érdemes használni, ahol egész számra van szükség, de az csak nulla vagy annál nagyobb lehet. Egy hétköznapi Gleam Int-et nem lehet erre használni, mert azok negatívak is lehetnek.
Az a modul, amelyik ezt a típust definiálja, definiálhat egy függvényt a belső egész szám kiolvasására, és egy függvényt a PositiveInt létrehozására, amely hibát ad vissza, ha az érték nem pozitív.
pub fn from_int(i: Int) -> Result(PositiveInt, String) {
case i {
_ if i < 0 -> Error("Value must be positive")
_ -> Ok(PositiveInt(i))
}
}
pub fn to_int(i: PositiveInt) -> Int {
i.inner
}
Ezzel az API-val más modulok nem tudnak negatív értékű PositiveInt-et létrehozni, így minden olyan függvény, amely PositiveInt-et kap, biztos lehet benne, hogy az érték pozitív.