Gleam tem funções de primeira classe, ou seja, funções são valores normais que podem ser atribuídos a variáveis, passados como argumentos e retornados por outras funções.
Uma função nomeada definida em um módulo pode ser referenciada pelo seu 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 também tem funções anônimas, que são definidas dentro de outras funções.
// Define the function
let f = fn(x) { x + 1 }
// Invoke the function
f(1) // -> 2
f(2) // -> 3
O tipo de uma função é escrito com uma sintaxe parecida com a das funções anônimas. O tipo de uma função que recebe um Int e um Float e retorna um Int é escrito assim:
fn(Int, Float) -> Int
Funções anônimas podem referenciar variáveis que estavam no escopo quando foram definidas, o que as torna closures.
let secret_number = 42
// This function always returns 42
fn() { secret_number }
A sintaxe de function capture oferece uma forma abreviada prática para criar funções anônimas que passam um único argumento para uma função. Estas duas expressões são equivalentes:
// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }
// Function capture syntax
let f = my_function(1, 2, _)
Neste exercício, você tem a tarefa de escrever o software de um dispositivo de criptografia que funciona realizando transformações nos dados. Você precisa de uma forma de criar funções complicadas de maneira flexível, combinando funções mais simples.
Para cada tarefa, retorne uma função anônima que possa ser invocada a partir do escopo de chamada.
Implemente secret_add. Ela deve retornar uma função que recebe um argumento e soma a ele o argumento passado para secret_add.
let adder = secret_add(2)
adder(2)
// -> 4
Implemente secret_subtract. Ela deve retornar uma função que recebe um argumento e subtrai desse argumento o segredo passado para secret_subtract.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
Implemente secret_multiply. Ela deve retornar uma função que recebe um argumento e o multiplica pelo segredo passado para secret_multiply.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
Implemente secret_divide. Ela deve retornar uma função que recebe um argumento e o divide pelo segredo passado para secret_divide.
let divider = secret_divide(3)
divider(32)
// -> 10
Implemente secret_combine. Ela deve retornar uma função que recebe um argumento e aplica a ele, em ordem, as duas funções passadas para secret_combine.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Crie sua conta no Exercism para aprender e dominar Gleam com 33 conceitos122 exercícios e mentoria humana de verdade, tudo de graça.