Percursos
/
Gleam
Gleam
/
Exercícios
/
Baú do Tesouro Seguro
Baú do Tesouro Seguro

Baú do Tesouro Seguro

Exercício de aprendizagem

Introdução

Tipos opacos

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

Os tipos opacos definem-se com a palavra-chave opaque.

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

Este tipo PositiveInt deve ser usado em situações em que se quer um inteiro, mas em que este tem de ser zero ou maior. Não se poderia usar um Int normal de Gleam, uma vez que também pode ser negativo.

O módulo que define este tipo pode definir uma função para obter o valor inteiro interior e uma função para criar o tipo PositiveInt, que devolve 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 esta API, os outros módulos não podem construir um PositiveInt com um valor negativo, por isso qualquer função que aceite um PositiveInt pode ter a certeza de que o valor é positivo.

Instruções

Os alunos mais atentos terão reparado que o tipo TreasureChest do exercício anterior não era assim tão seguro!

Se usaste a função get_treasure, tinhas de fornecer a palavra-passe, mas mesmo assim podias desestruturar o tipo TreasureChest para obter o tesouro sem precisares de saber a palavra-passe.

Vamos corrigir isso com um tipo opaco.

1. Define o tipo opaco TreasureChest.

O TreasureChest contém dois campos:

  • Uma palavra-passe, que é uma String.
  • Um tesouro, que é um tipo genérico.

O tipo TreasureChest tem de ser opaco.

2. Define a função create.

Esta função recebe dois argumentos:

  • Uma palavra-passe, que é uma String.
  • Um valor de tesouro de qualquer tipo.

A função devolve um TreasureChest que contém a palavra-passe e o valor.

Se a palavra-passe tiver menos de 8 carateres, a função deve devolver um erro com a mensagem Password must be at least 8 characters long.

3. Define a função open.

Esta função recebe dois argumentos:

  • Um TreasureChest.
  • Uma palavra-passe, que é uma String.

Se a palavra-passe corresponder à palavra-passe do TreasureChest, a função deve devolver o tesouro; caso contrário, deve devolver um erro com a mensagem Incorrect password.

Editar via GitHub A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Baú do Tesouro Seguro?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.