O Gleam tem funções de primeira classe, o que significa que as funções são valores normais que podem ser atribuídos a variáveis, passados como argumentos e devolvidos por outras funções.
Uma função com nome definida num 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
}
O 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 escreve-se com uma sintaxe semelhante à das funções anónimas. O tipo de uma função que recebe um Int e um Float e devolve um Int escreve-se assim:
fn(Int, Float) -> Int
As funções anónimas podem referenciar variáveis que estavam no âmbito quando foram definidas, o que as torna closures.
let secret_number = 42
// This function always returns 42
fn() { secret_number }
A sintaxe de captura de função é uma forma abreviada e prática de criar funções anónimas que passam um único argumento a 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, foi-te pedido que escrevas o software de um dispositivo de encriptação que funciona através de transformações sobre dados. Precisas de uma forma flexível de criar funções complicadas, combinando funções mais simples entre si.
Em cada tarefa, devolve uma função anónima que possa ser invocada a partir do âmbito de chamada.
Implementa secret_add. Esta deve devolver uma função que recebe um argumento e lhe soma o argumento passado a secret_add.
let adder = secret_add(2)
adder(2)
// -> 4
Implementa secret_subtract. Esta deve devolver uma função que recebe um argumento e subtrai-lhe o segredo passado a secret_subtract.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
Implementa secret_multiply. Esta deve devolver uma função que recebe um argumento e o multiplica pelo segredo passado a secret_multiply.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
Implementa secret_divide. Esta deve devolver uma função que recebe um argumento e o divide pelo segredo passado a secret_divide.
let divider = secret_divide(3)
divider(32)
// -> 10
Implementa secret_combine. Esta deve devolver uma função que recebe um argumento e lhe aplica, por ordem, as duas funções passadas a secret_combine.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.