I tipi opachi in Gleam sono tipi personalizzati in cui solo il modulo che definisce il tipo può costruire o eseguire il pattern matching sui valori di quel tipo. Sono utili per creare tipi che dovrebbero essere usati solo in un modo specifico.
I tipi opachi si definiscono usando la parola chiave opaque.
pub opaque type PositiveInt {
PositiveInt(inner: Int)
}
Questo tipo PositiveInt è pensato per le situazioni in cui serve un intero, ma che sia zero o maggiore. Un normale Int di Gleam non potrebbe essere usato, perché può anche essere negativo.
Il modulo che definisce questo tipo può definire una funzione per ottenere il valore intero interno ed 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 qualsiasi funzione che accetta un PositiveInt può essere certa che il valore sia positivo.
Gli studenti più attenti avranno notato che il tipo TreasureChest dell'esercizio precedente non era poi così sicuro!
Se hai usato la funzione get_treasure dovevi fornire la password, ma potevi comunque destrutturare il tipo TreasureChest per ottenere il tesoro senza dover conoscere la password.
Risolviamo il problema usando un tipo opaco.
TreasureChest.TreasureChest contiene due campi:
String.Il tipo TreasureChest deve essere opaco.
create.Questa funzione accetta due argomenti:
String.La funzione restituisce un TreasureChest che contiene la password e il valore.
Se la password è più corta di 8 caratteri, la funzione deve restituire un errore che dice Password must be at least 8 characters long.
open.Questa funzione accetta due argomenti:
TreasureChest.String.Se la password corrisponde a quella contenuta nel TreasureChest, la funzione deve restituire il tesoro, altrimenti deve restituire un errore che dice Incorrect password.
Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.