Rutas
/
Gleam
Gleam
/
Ejercicios
/
El cofre del tesoro seguro
El cofre del tesoro seguro

El cofre del tesoro seguro

Ejercicio de aprendizaje

Introducción

Tipos opacos

Los tipos opacos en Gleam son tipos personalizados en los que solo el módulo que define el tipo puede construir valores del tipo o hacer coincidencia de patrones con ellos. Esto es útil para crear tipos que solo deberían usarse de una forma concreta.

Los tipos opacos se definen con la palabra clave opaque.

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

Este tipo PositiveInt se debe usar en situaciones en las que se quiere un entero, pero tiene que ser mayor o igual que cero. No se podría usar un Int normal de Gleam, ya que también pueden ser negativos.

El módulo que define este tipo puede definir una función para obtener el valor entero interno y una función para crear el tipo PositiveInt, que devolverá un error si el valor no es 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 esta API, otros módulos no pueden construir un PositiveInt con un valor negativo, así que cualquier función que reciba un PositiveInt puede estar segura de que el valor es positivo.

Instrucciones

¡Los estudiantes con buen ojo se habrán dado cuenta de que el tipo TreasureChest del ejercicio anterior no era tan seguro!

Si usabas la función get_treasure, tenías que proporcionar la contraseña, pero aún podías desestructurar el tipo TreasureChest para obtener el tesoro sin necesidad de saber la contraseña.

Vamos a arreglarlo usando un tipo opaco.

1. Define el tipo opaco TreasureChest.

El TreasureChest contiene dos campos:

  • Una contraseña que es de tipo String.
  • Un tesoro que es de tipo genérico.

El tipo TreasureChest debe ser opaco.

2. Define la función create.

Esta función recibe dos argumentos:

  • Una contraseña de tipo String.
  • Un valor de tesoro de cualquier tipo.

La función devuelve un TreasureChest que contiene la contraseña y el valor.

Si la contraseña tiene menos de 8 caracteres, la función debe devolver un error que diga Password must be at least 8 characters long.

3. Define la función open.

Esta función recibe dos argumentos:

  • Un TreasureChest.
  • Una contraseña de tipo String.

Si la contraseña coincide con la contraseña del TreasureChest, la función debe devolver el tesoro; de lo contrario, debe devolver un error que diga Incorrect password.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Gleam Exercism

¿Listo para empezar El cofre del tesoro seguro?

Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.