Opake Typen sind in Gleam Custom Types, bei denen nur das Modul, das den Typ definiert, Werte dieses Typs erzeugen oder per Pattern Matching zerlegen kann. Das ist nützlich, um Typen zu erstellen, die nur auf eine bestimmte Weise verwendet werden sollen.
Definiert werden opake Typen mit dem Schlüsselwort opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Der Typ PositiveInt ist für Situationen gedacht, in denen eine Ganzzahl gewünscht ist, die aber null oder größer sein muss. Ein normales Gleam-Int lässt sich dafür nicht verwenden, denn es kann auch negativ sein.
Das Modul, das diesen Typ definiert, kann eine Funktion bereitstellen, die den inneren Ganzzahlwert liefert, und eine Funktion zum Erstellen des Typs PositiveInt, die einen Fehler zurückgibt, wenn der Wert nicht positiv ist.
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
}
Mit dieser API können andere Module keinen negativen Wert vom Typ PositiveInt erzeugen. Eine Funktion, die einen Wert vom Typ PositiveInt entgegennimmt, kann sich also sicher sein, dass der Wert positiv ist.