學習軌道
/
Gleam
Gleam
/
練習
/
Betty 的自行車店
Betty 的自行車店

Betty 的自行車店

學習練習

簡介

整數

Gleam 裡有兩種不同的數字:整數和浮點數。

整數就是不帶小數的數字。

let integer = 3
// -> 3

Gleam 有幾個可以處理整數的運算子。

1 + 1 // -> 2
5 - 1 // -> 4
5 / 2 // -> 2
3 * 3 // -> 9
5 % 2 // -> 1

2 > 1  // -> True
2 < 1  // -> False
2 >= 1 // -> True
2 <= 1 // -> False

浮點數

浮點數是小數點後還有一個或多個數字的數字。

let float = 3.45
// -> 3.45

浮點數也有一組自己的運算子。

1.0 +. 1.4 // -> 2.4
5.0 -. 1.5 // -> 3.5
5.0 /. 2.0 // -> 2.5
3.0 *. 3.1 // -> 9.3

2.0 >. 1.0  // -> True
2.0 <. 1.0  // -> False
2.0 >=. 1.0 // -> True
2.0 <=. 1.0 // -> False

模組

模組

Gleam 的程式碼是以模組來組織的,而每個檔案就是一個 Gleam 模組。

到目前為止,我們都是用 pub fn 語法來寫函式,這會定義一個公開、讓其他模組也能使用的函式。用 fn 定義的函式則只限它所定義的模組內部使用,其他模組無法取用。

// This function is public
pub fn add(x, y) {
  x + y
}

// This function is private
fn subtract(x, y) {
  x - y
}

Gleam 模組有名稱,名稱取決於它在 src 或 test 目錄裡的路徑。

舉例來說,定義在src\geometry\rectangle.gleam(在 Windows 上)或src/geometry/rectangle.gleam(在類 UNIX 作業系統上)的模組,名稱會是geometry/rectangle。

從其他模組匯入函式

要取用定義在其他模組裡的函式,得透過匯入。 匯入某個模組時,該模組所公開的所有函式都會變成可以取用。 不過取用它們的方式,會隨著模組的匯入方式而不同。

限定匯入是預設的方式,要取用這類模組裡的函式(例如gleam/list模組裡的map函式),必須在函式前面加上模組名稱(list.map)。

// Import the int module
import gleam/int

pub fn run(x: Int) -> String {
  // Use the to_string function from the int module
  int.to_string(x)
}

預設情況下,用來指稱模組的名稱是模組名稱的最後一段,在這裡就是int,不過可以用 as 關鍵字來改變。

// Import the int module and refer to it as i
import gleam/int as i

pub fn run(x: Int) -> String {
  i.to_string(x)
}

非限定匯入則讓你能直接取用該模組公開的函式,不必加上前綴。

// Import the to_string function from the int module
import gleam/int.{to_string}

pub fn run(x: Int) -> String {
  to_string(x)
}

限定匯入比較受歡迎,因為它能讓讀者更清楚函式是從哪裡來的,也能避免名稱衝突。

標準函式庫

Gleam 的標準函式庫內容豐富,而且有完整的文件。文件可以在 hexdocs.pm/gleam_stdlib 線上查閱。把這個連結存起來吧,你會很常用到喔!

大多數內建的資料型態都有對應的模組,提供處理該型態的函式。例如整數有gleam/int模組、字串有gleam/string模組、陣列有gleam/list模組等等。

說明

在這道練習中,你將寫一些程式碼來協助 Betty's Bike Shop,這是一間販售自行車與零件的線上商店。 你有三個任務,目標是在網站上正確顯示自行車與零件的價格。

1. 匯出pence_to_pounds函式

你的同事已經寫好這個模組的骨架,也就是尚未完成的pence_to_pounds和pounds_to_string函式。 不過,他們忘了匯出pence_to_pounds函式,所以它目前無法被其他模組或測試套件看見。

請匯出pence_to_pounds函式。

2. 將便士轉換為英鎊

目前,價格是以整數的便士儲存(這間自行車店位於英國)。 在網站上,我們想以英鎊顯示價格,其中 1.00 英鎊相當於 100 便士。 你的第一個任務是實作pence_to_pounds函式,它接受以Int表示的便士數量,並將其轉換成等值的英鎊,型別為Float。 你也應該為這個函式加上型別標註。

pence_to_pounds(106)
// -> 1.06

3. 格式化價格,以便在網站上顯示

由於 Betty's 的自行車是以英鎊販售,價格應該以「£」符號顯示。 你的第二個任務因此是實作pounds_to_string函式,它接受以Float表示的英鎊金額,並回傳把英鎊符號加在前面、以String顯示的價格。

在使用之前,你應該先匯入gleam/float和gleam/string模組。

你也應該為pounds_to_string定義型別標註。

pounds_to_string(1.06)
// -> "£1.06"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 Betty 的自行車店 了嗎?

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