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