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, _)
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.
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
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
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
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
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
Iscriviti a Exercism per imparare e padroneggiare Gleam con 33 concetti122 esercizi e il mentoring di persone reali, tutto gratis.