Secretos

Secretos

Ejercicio de aprendizaje

Introducción

Funciones anónimas

Gleam tiene funciones de primera clase, lo que significa que las funciones son valores normales que se pueden asignar a variables, pasar como argumentos y devolver desde otras funciones.

Una función con nombre definida en un módulo se puede referenciar por su nombre.

pub fn main() {
  // Assign the function to a variable
  let f = add_one
  
  // Invoke the function
  f(1) // -> 2
  f(2) // -> 3
}

fn add_one(x) {
  x + 1
}

Gleam también tiene funciones anónimas, que se definen dentro de otras funciones.

// Define the function
let f = fn(x) { x + 1 }

// Invoke the function
f(1) // -> 2
f(2) // -> 3

El tipo de una función se escribe con una sintaxis similar a la de las funciones anónimas. El tipo de una función que recibe un Int y un Float y devuelve un Int se escribe así:

fn(Int, Float) -> Int

Las funciones anónimas pueden referenciar variables que estaban en el ámbito cuando se definieron, lo que las convierte en closures.

let secret_number = 42

// This function always returns 42
fn() { secret_number }

La sintaxis de captura de función ofrece una forma abreviada y práctica de crear funciones anónimas que pasan un solo argumento a una función. Estas dos expresiones son equivalentes:

// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }

// Function capture syntax
let f = my_function(1, 2, _)

Instrucciones

En este ejercicio, tienes la tarea de escribir el software de un dispositivo de cifrado que funciona realizando transformaciones sobre los datos. Necesitas una forma flexible de crear funciones complicadas combinando funciones más simples.

Para cada tarea, devuelve una función anónima que se pueda invocar desde el ámbito desde el que se llama.

1. Crea un sumador

Implementa secret_add. Debe devolver una función que recibe un argumento y le suma el argumento que se pasó a secret_add.

let adder = secret_add(2)
adder(2)
// -> 4

2. Crea un restador

Implementa secret_subtract. Debe devolver una función que recibe un argumento y le resta el secreto que se pasó a secret_subtract.

let subtractor = secret_subtract(2)
subtractor(3)
// -> 1

3. Crea un multiplicador

Implementa secret_multiply. Debe devolver una función que recibe un argumento y lo multiplica por el secreto que se pasó a secret_multiply.

let multiplier = secret_multiply(7)
multiplier(3)
// -> 21

4. Crea un divisor

Implementa secret_divide. Debe devolver una función que recibe un argumento y lo divide entre el secreto que se pasó a secret_divide.

let divider = secret_divide(3)
divider(32)
// -> 10

5. Crea un combinador de funciones

Implementa secret_combine. Debe devolver una función que recibe un argumento y le aplica, en orden, las dos funciones que se pasaron a secret_combine.

let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)

combined(6)
// -> 14
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Gleam Exercism

¿Todo listo para empezar Secretos?

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