自訂型別是在 Gleam 中定義新資料型態的方式。它們可以有多個_變體_,每個變體都有自己的名稱。
pub type Season {
Spring
Summer
Autumn
Winter
}
自訂型別的每個變體可以選擇性地帶有一些資料,而不同的變體可以有不同的資料型態。當變體帶有資料時,就稱為_記錄_。
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
要為特定變體建立值,如果它不含額外資料(Spring),可以直接使用其名稱;如果含有資料,則像呼叫函式一樣呼叫它(SomeInt(2))。
let spring = Spring
let integerTwo = SomeInt(2)
自訂型別和 Gleam 中的所有東西一樣,具有_結構相等_,這表示相同變體且資料相同的兩個值相等。
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
可以使用 case 運算式對自訂型別的變體進行模式比對。
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
這道練習的主題是情人節,你和你的伴侶打算一起做點開心的事。你的伴侶有很多想法,現在請你為這些想法評分,好找出你們要一起從事的活動。
你的伴侶提出了以下想法:
你有 6 個任務,幫助你選出情人節活動。
對於伴侶提出的每個想法,你的回應會是以下 3 種選項之一:同意、不同意或也許。
定義 Approval 自訂型別,用以下 3 種情況來表示這些選項:Yes、No 和 Maybe。
你的伴侶選了 2 間可能的餐廳:一間是韓式料理,另一間是土耳其料理。
定義 Cuisine 自訂型別,用以下 2 種情況來表示這些料理類型:Korean 和 Turkish。
電影多到數不清,所以為了縮小範圍,你的伴侶也列出了電影的類型。
定義 Genre 自訂型別,用以下情況來表示這些類型:Crime、Horror、Romance 和 Thriller。
如前所述,你的伴侶想出了 5 種不同的活動:玩桌遊、放鬆一下、看電影、上餐廳和散步。
定義 Activity 自訂型別來表示這些活動類型:
BoardGame:沒有附帶資料。Chill:沒有附帶資料。Movie:帶有 Genre 作為附帶資料。Restaurant:帶有 Cuisine 作為附帶資料。Walk:帶有一個 Int 作為附帶資料,代表要步行的公里數。最後,你終於可以為伴侶的想法評分了。以下是你對這些想法的感覺:
實作一個名為 rate_activity 的函式,它接收一個 Activity 值,並根據上述感受回傳 Approval:
rate_activity(Restaurant(Turkish))
// -> Maybe