Secrets

Secrets

Exercice d'apprentissage

Introduction

Fonctions anonymes

Gleam a des fonctions de première classe, ce qui signifie que les fonctions sont des valeurs comme les autres : on peut les affecter à des variables, les passer en arguments et les renvoyer depuis d'autres fonctions.

Une fonction nommée définie dans un module peut être référencée par son nom.

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 dispose aussi de fonctions anonymes, qui se définissent à l'intérieur d'autres fonctions.

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

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

Le type d'une fonction s'écrit avec une syntaxe semblable à celle des fonctions anonymes. Le type d'une fonction qui prend un Int et un Float et renvoie un Int s'écrit comme ceci :

fn(Int, Float) -> Int

Les fonctions anonymes peuvent référencer des variables qui étaient dans leur portée au moment de leur définition, ce qui en fait des closures.

let secret_number = 42

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

La syntaxe de capture de fonction offre un raccourci pratique pour créer des fonctions anonymes qui passent un seul argument à une fonction. Ces deux expressions sont équivalentes :

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

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

Instructions

Dans cet exercice, on t'a chargé d'écrire le logiciel d'un appareil de chiffrement qui fonctionne en effectuant des transformations sur des données. Tu as besoin d'un moyen de créer de manière flexible des fonctions complexes en combinant des fonctions plus simples entre elles.

Pour chaque tâche, renvoie une fonction anonyme qui peut être appelée depuis la portée de l'appel.

1. Crée un additionneur

Implémente secret_add. Elle doit renvoyer une fonction qui prend un argument et lui ajoute l'argument passé à secret_add.

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

2. Crée un soustracteur

Implémente secret_subtract. Elle doit renvoyer une fonction qui prend un argument et soustrait à cet argument le secret passé à secret_subtract.

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

3. Crée un multiplicateur

Implémente secret_multiply. Elle doit renvoyer une fonction qui prend un argument et le multiplie par le secret passé à secret_multiply.

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

4. Crée un diviseur

Implémente secret_divide. Elle doit renvoyer une fonction qui prend un argument et le divise par le secret passé à secret_divide.

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

5. Crée un combinateur de fonctions

Implémente secret_combine. Elle doit renvoyer une fonction qui prend un argument et lui applique, dans l'ordre, les deux fonctions passées à secret_combine.

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

combined(6)
// -> 14
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Gleam Exercism

Prêt à commencer Secrets ?

Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.