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 toma un Int y un Float y devuelve un Int se escribe así:

fn(Int, Float) -> Int

Las funciones anónimas pueden hacer referencia a variables que estaban en el scope 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 funciones ofrece una forma abreviada muy cómoda de crear funciones anónimas que pasan un único 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 de crear funciones complicadas de manera flexible combinando funciones más sencillas entre sí.

Para cada tarea, devuelve una función anónima que se pueda invocar desde el scope que hace la llamada.

1. Crea un sumador

Implementa secret_add. Debe devolver una función que recibe un argumento y le suma el argumento que se le pasa 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 le pasa 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 le pasa 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 por el secreto que se le pasa 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 le pasan 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 pestaña nueva
Gleam Exercism

¿Listo para empezar Secretos?

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