祕密

祕密

學習練習

簡介

匿名函式

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

說明

在這個練習中,你的任務是為一台加密裝置撰寫軟體,這台裝置會透過對資料進行轉換來運作。你需要一種方法,能靈活地將較簡單的函式組合起來,建立出複雜的函式。

每個任務都請回傳一個匿名函式,而且這個函式可以從呼叫端的作用域中被呼叫。

1. 建立一個加法器

實作secret_add。它應該回傳一個函式,該函式接受一個引數,並將傳入secret_add的引數與其相加。

let adder = secret_add(2)
adder(2)
// -> 4

2. 建立一個減法器

實作secret_subtract。它應該回傳一個函式,該函式接受一個引數,並從該引數中減去傳入secret_subtract的秘密值。

let subtractor = secret_subtract(2)
subtractor(3)
// -> 1

3. 建立一個乘法器

實作secret_multiply。它應該回傳一個函式,該函式接受一個引數,並將其乘以傳入secret_multiply的秘密值。

let multiplier = secret_multiply(7)
multiplier(3)
// -> 21

4. 建立一個除法器

實作secret_divide。它應該回傳一個函式,該函式接受一個引數,並將其除以傳入secret_divide的秘密值。

let divider = secret_divide(3)
divider(32)
// -> 10

5. 建立一個函式組合器

實作secret_combine。它應該回傳一個函式,該函式接受一個引數,並依序將傳入secret_combine的兩個函式套用到該引數上。

let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)

combined(6)
// -> 14
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 祕密 了嗎?

註冊 Exercism,透過 33 個概念122 個練習 和真人引導來學習並精通 Gleam,全部免費。