Segredos

Segredos

Exercício de aprendizagem

Introdução

Funções anónimas

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, _)

Instruções

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.

1. Cria um somador

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

2. Cria um subtrator

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

3. Cria um multiplicador

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

4. Cria um divisor

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

5. Cria um combinador de funções

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
Editar via GitHub A ligação abre numa nova janela ou separador
Gleam Exercism

Estás pronto para começar Segredos?

Inscreve-te no Exercism para aprenderes e dominares Gleam com 33 conceitos122 exercícios, e mentoria humana real, tudo grátis.