情人節

情人節

學習練習

簡介

自訂型別

自訂型別是在 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 個任務,幫助你選出情人節活動。

1. 定義同意程度

對於伴侶提出的每個想法,你的回應會是以下 3 種選項之一:同意、不同意或也許。

定義 Approval 自訂型別,用以下 3 種情況來表示這些選項:Yes、No 和 Maybe。

2. 定義料理類型

你的伴侶選了 2 間可能的餐廳:一間是韓式料理,另一間是土耳其料理。

定義 Cuisine 自訂型別,用以下 2 種情況來表示這些料理類型:Korean 和 Turkish。

3. 定義電影類型

電影多到數不清,所以為了縮小範圍,你的伴侶也列出了電影的類型。

定義 Genre 自訂型別,用以下情況來表示這些類型:Crime、Horror、Romance 和 Thriller。

4. 定義活動

如前所述,你的伴侶想出了 5 種不同的活動:玩桌遊、放鬆一下、看電影、上餐廳和散步。

定義 Activity 自訂型別來表示這些活動類型:

  • BoardGame:沒有附帶資料。
  • Chill:沒有附帶資料。
  • Movie:帶有 Genre 作為附帶資料。
  • Restaurant:帶有 Cuisine 作為附帶資料。
  • Walk:帶有一個 Int 作為附帶資料,代表要步行的公里數。

5. 為活動評分

最後,你終於可以為伴侶的想法評分了。以下是你對這些想法的感覺:

  • 玩桌遊:不同意。
  • 放鬆一下:不同意。
  • 看電影:浪漫電影就同意,其他電影就不同意。
  • 上餐廳:韓式料理就同意,土耳其料理就也許。
  • 散步:超過 11 公里就同意;超過 6 公里就也許;其他情況就不同意。

實作一個名為 rate_activity 的函式,它接收一個 Activity 值,並根據上述感受回傳 Approval:

rate_activity(Restaurant(Turkish))
// -> Maybe
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 情人節 了嗎?

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