In Gleam, i tipi opachi sono tipi personalizzati in cui solo il modulo che definisce il tipo può costruire valori di quel tipo o fare pattern matching su di essi. Sono utili per creare tipi che vanno usati solo in un modo specifico.
I tipi opachi si definiscono con la parola chiave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Il tipo PositiveInt serve nelle situazioni in cui si vuole un int, ma questo deve essere maggiore o uguale a zero. Un normale Int di Gleam non andrebbe bene, perché può anche essere negativo.
Il modulo che definisce questo tipo può definire una funzione per ottenere il valore int interno e una funzione per creare il tipo PositiveInt, che restituirà un errore se il valore non è positivo.
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
}
Con questa API, gli altri moduli non possono costruire un PositiveInt con un valore negativo, quindi ogni funzione che accetta un PositiveInt può essere sicura che il valore sia positivo.