Track
/
Gleam
Gleam
/
Esercizi
/
Il forziere del tesoro sicuro
Il forziere del tesoro sicuro

Il forziere del tesoro sicuro

Esercizio di apprendimento

Introduzione

Tipi opachi

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.

Istruzioni

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.

1. Definire il tipo opaco TreasureChest.

TreasureChest contiene due campi:

  • Una password, che è una String.
  • Un tesoro, che è un tipo generico.

Il tipo TreasureChest deve essere opaco.

2. Definire la funzione create.

Questa funzione accetta due argomenti:

  • Una password String.
  • Un valore del tesoro di qualsiasi tipo.

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.

3. Definire la funzione open.

Questa funzione accetta due argomenti:

  • Un TreasureChest.
  • Una password 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.

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Gleam Exercism

Vuoi iniziare Il forziere del tesoro sicuro?

Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.