Trilhas
/
Gleam
Gleam
/
Exercícios
/
Baú de Tesouro Seguro
Baú de Tesouro Seguro

Baú de Tesouro Seguro

Exercício de aprendizagem

Introdução

Tipos opacos

Tipos opacos em Gleam são tipos personalizados em que apenas o módulo que define o tipo pode construir valores desse tipo ou fazer correspondência de padrões com eles. Isso é útil para criar tipos que só devem ser usados de uma forma específica.

Os tipos opacos são definidos com a palavra-chave opaque.

pub opaque type PositiveInt {
  PositiveInt(inner: Int)
}

Esse tipo PositiveInt deve ser usado em situações em que se quer um int, mas ele precisa ser maior ou igual a zero. Um Int comum do Gleam não poderia ser usado, já que os Int também podem ser negativos.

O módulo que define esse tipo pode definir uma função para obter o valor int interno e uma função para criar o tipo PositiveInt, que retorna um erro se o valor não for 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
}

Com essa API, outros módulos não conseguem construir um PositiveInt com valor negativo, então qualquer função que receba um PositiveInt pode ter certeza de que o valor é positivo.

Instruções

Quem prestou atenção deve ter notado que o tipo TreasureChest do exercício anterior não era tão seguro assim!

Se você usou a função get_treasure, precisava fornecer a senha, mas ainda podia desestruturar o tipo TreasureChest para obter o tesouro sem precisar saber a senha.

Vamos corrigir isso usando um tipo opaco.

1. Defina o tipo opaco TreasureChest.

O TreasureChest contém dois campos:

  • Uma senha, que é uma String.
  • Um tesouro, que é um tipo genérico.

O tipo TreasureChest deve ser opaco.

2. Defina a função create.

Essa função recebe dois argumentos:

  • Uma senha String.
  • Um valor de tesouro de qualquer tipo.

A função retorna um TreasureChest contendo a senha e o valor.

Se a senha tiver menos de 8 caracteres, a função deve retornar um erro dizendo Password must be at least 8 characters long.

3. Defina a função open.

Essa função recebe dois argumentos:

  • Um TreasureChest.
  • Uma senha String.

Se a senha corresponder à senha do TreasureChest, a função deve retornar o tesouro; caso contrário, deve retornar um erro dizendo Incorrect password.

Editar via GitHub O link abre em uma nova janela ou aba
Gleam Exercism

Tudo pronto para começar Baú de Tesouro Seguro?

Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.