У Gleam функції належать до першого класу, тобто це звичайні значення, які можна присвоювати змінним, передавати як аргументи й повертати з інших функцій.
На іменовану функцію, визначену в модулі, можна посилатися за її назвою.
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 є анонімні функції, які визначають усередині інших функцій.
// Define the function
let f = fn(x) { x + 1 }
// Invoke the function
f(1) // -> 2
f(2) // -> 3
Тип функції записують за синтаксисом, схожим на синтаксис анонімних функцій. Тип функції, яка приймає Int і Float та повертає Int, записують так:
fn(Int, Float) -> Int
Анонімні функції можуть посилатися на змінні, які були в області видимості на момент їх визначення, і тому вони є замиканнями.
let secret_number = 42
// This function always returns 42
fn() { secret_number }
Синтаксис захоплення функції дає зручний скорочений запис для створення анонімних функцій, які передають єдиний аргумент у функцію. Ці два вирази рівнозначні:
// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }
// Function capture syntax
let f = my_function(1, 2, _)
У цій вправі нам доручено написати програмне забезпечення для пристрою шифрування, який працює, виконуючи перетворення даних. Нам потрібен спосіб гнучко створювати складні функції, поєднуючи простіші функції.
Для кожного завдання поверніть анонімну функцію, яку можна викликати з області видимості виклику.
Реалізуйте secret_add. Вона повинна повертати функцію, яка приймає один аргумент і додає до нього аргумент, переданий у secret_add.
let adder = secret_add(2)
adder(2)
// -> 4
Реалізуйте secret_subtract. Вона повинна повертати функцію, яка приймає один аргумент і віднімає від нього секрет, переданий у secret_subtract.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
Реалізуйте secret_multiply. Вона повинна повертати функцію, яка приймає один аргумент і множить його на секрет, переданий у secret_multiply.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
Реалізуйте secret_divide. Вона повинна повертати функцію, яка приймає один аргумент і ділить його на секрет, переданий у secret_divide.
let divider = secret_divide(3)
divider(32)
// -> 10
Реалізуйте secret_combine. Вона повинна повертати функцію, яка приймає один аргумент і послідовно застосовує до нього дві функції, передані в secret_combine.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Зареєструйтеся на Exercism, щоб вивчати й опановувати Gleam, а також 33 концепції122 вправи та справжнє наставництво від людей, і все це безкоштовно.