Segreti

Segreti

Esercizio di apprendimento

Introduzione

Funzioni anonime

In Gleam le funzioni sono di prima classe: sono valori normali che si possono assegnare a variabili, passare come argomenti e restituire da altre funzioni.

Una funzione con nome definita in un modulo può essere referenziata tramite il suo nome.

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 ha anche le funzioni anonime, che vengono definite all'interno di altre funzioni.

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

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

Il tipo di una funzione si scrive con una sintassi simile a quella delle funzioni anonime. Il tipo di una funzione che prende un Int e un Float e restituisce un Int si scrive così:

fn(Int, Float) -> Int

Le funzioni anonime possono fare riferimento a variabili che erano nello scope quando sono state definite: questo le rende delle closure.

let secret_number = 42

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

La sintassi di function capture offre una scorciatoia comoda per creare funzioni anonime che passano un singolo argomento a una funzione. Queste due espressioni sono equivalenti:

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

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

Istruzioni

In questo esercizio, dovrai scrivere il software per un dispositivo di cifratura che funziona applicando trasformazioni ai dati. Ti servirà un modo per creare in modo flessibile funzioni complicate combinando insieme funzioni più semplici.

Per ogni attività, restituisci una funzione anonima che possa essere chiamata dallo scope chiamante.

1. Crea un sommatore

Implementa secret_add. Deve restituire una funzione che accetta un argomento e vi aggiunge l'argomento passato a secret_add.

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

2. Crea un sottrattore

Implementa secret_subtract. Deve restituire una funzione che accetta un argomento e sottrae da quell'argomento il segreto passato a secret_subtract.

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

3. Crea un moltiplicatore

Implementa secret_multiply. Deve restituire una funzione che accetta un argomento e lo moltiplica per il segreto passato a secret_multiply.

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

4. Crea un divisore

Implementa secret_divide. Deve restituire una funzione che accetta un argomento e lo divide per il segreto passato a secret_divide.

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

5. Crea un combinatore di funzioni

Implementa secret_combine. Deve restituire una funzione che accetta un argomento e vi applica, nell'ordine, le due funzioni passate a secret_combine.

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

combined(6)
// -> 14
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Gleam Exercism

Vuoi iniziare Segreti?

Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.