Translate

viernes, 13 de septiembre de 2024

Tipos opacos de Gleam


import gleam/io


pub fn main() {

  let positive = new(1)

  let zero = new(0)

  let negative = new(-1)


  io.debug(to_int(positive))

  io.debug(to_int(zero))

  io.debug(to_int(negative))

}


pub opaque type PositiveInt {

  PositiveInt(inner: Int)

}


pub fn new(i: Int) -> PositiveInt {

  case i >= 0 {

    True -> PositiveInt(i)

    False -> PositiveInt(0)

  }

}


pub fn to_int(i: PositiveInt) -> Int {

  i.inner

}


El Resultado : 

1
0
0

Los tipos opacos son tipos en los que el tipo personalizado es público y puede ser utilizado por otros módulos, pero los constructores del tipo son privados y solo pueden ser utilizados por el módulo que define el tipo. Esto evita que otros módulos construyan o realicen una coincidencia de patrones con el tipo.

Esto es útil para crear tipos con constructores inteligentes. Un constructor inteligente es una función que construye un valor de un tipo, pero es más restrictivo que si el programador utilizara uno de los constructores del tipo directamente. Esto puede ser útil para garantizar que el tipo se utilice correctamente.

Por ejemplo, este tipo personalizado PositiveInt es opaco. Si otros módulos quieren construir uno, deben utilizar la nueva función, que garantiza que el entero sea positivo.