Gleam hat Funktionen als Werte erster Klasse. Das bedeutet, dass Funktionen normale Werte sind: Du kannst sie Variablen zuweisen, als Argumente übergeben und aus anderen Funktionen zurückgeben.
Eine benannte Funktion, die in einem Modul definiert ist, kannst du über ihren Namen referenzieren.
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 kennt außerdem anonyme Funktionen, die du innerhalb anderer Funktionen definierst.
// Define the function
let f = fn(x) { x + 1 }
// Invoke the function
f(1) // -> 2
f(2) // -> 3
Den Typ einer Funktion schreibst du mit einer ähnlichen Syntax wie anonyme Funktionen. Der Typ einer Funktion, die einen Int und einen Float entgegennimmt und einen Int zurückgibt, sieht so aus:
fn(Int, Float) -> Int
Anonyme Funktionen können auf Variablen zugreifen, die sich beim Definieren im Gültigkeitsbereich befanden. Dadurch sind sie Closures.
let secret_number = 42
// This function always returns 42
fn() { secret_number }
Die Syntax der Function Capture bietet eine praktische Kurzschreibweise, um anonyme Funktionen zu erstellen, die ein einzelnes Argument an eine Funktion übergeben. Diese beiden Ausdrücke sind äquivalent:
// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }
// Function capture syntax
let f = my_function(1, 2, _)
In dieser Übung sollst du die Software für ein Verschlüsselungsgerät schreiben, das Daten durch Transformationen verändert. Du brauchst eine Möglichkeit, komplizierte Funktionen flexibel zu erstellen, indem du einfachere Funktionen kombinierst.
Gib für jede Aufgabe eine anonyme Funktion zurück, die aus dem aufrufenden Gültigkeitsbereich heraus aufgerufen werden kann.
Implementiere secret_add. Die Funktion sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und zu diesem das Argument addiert, das an secret_add übergeben wurde.
let adder = secret_add(2)
adder(2)
// -> 4
Implementiere secret_subtract. Die Funktion sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und den geheimen Wert, der an secret_subtract übergeben wurde, von diesem Argument subtrahiert.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
Implementiere secret_multiply. Die Funktion sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und dieses Argument mit dem geheimen Wert multipliziert, der an secret_multiply übergeben wurde.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
Implementiere secret_divide. Die Funktion sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und dieses Argument durch den geheimen Wert dividiert, der an secret_divide übergeben wurde.
let divider = secret_divide(3)
divider(32)
// -> 10
Implementiere secret_combine. Die Funktion sollte eine Funktion zurückgeben, die ein Argument entgegennimmt und auf dieses Argument der Reihe nach die beiden Funktionen anwendet, die an secret_combine übergeben wurden.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Melde dich bei Exercism an, um Gleam mit 33 Konzepte122 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.