寶箱

寶箱

學習練習

簡介

泛型

當一個型別能使用_型別參數_來容納任何型別的值時,它就是_泛型型別_。

例如,這個Box型別帶有型別參數a(以小寫字母書寫)。

pub type Box(a) {
  Box(a)
}

型別參數a是任何型別的佔位符,所以Box可以搭配字串、整數或任何其他型別使用。

Box("Hello, Joe!") // The type is Box(String)

Box(42) // The type is Box(Int)

一個型別可以有多個型別參數,只要用逗號分隔它們即可。

pub type Pair(a, b) {
  Pair(a, b)
}

泛型函式

型別參數也可以用在函式的引數中。

這個函式接受一個型別為a的值,並將一個接受a、回傳b的函式呼叫兩次。

pub fn twice(value: a, f: fn(a) -> b) -> b {
  f(value)
  f(value)
}
// The type is fn(String, fn(String) -> Nil) -> Nil
twice("Hello, Joe!", io.println)

說明

在這道練習中,你將要寫一個通用的 TreasureChest(或者說,有魔法般的!),用來存放一些寶藏。

1. 定義 TreasureChest 泛型自訂型別

定義一個只有單一變體的TreasureChest自訂型別。

這個變體應該有一個關聯的String值,用來存放寶箱的密碼。

這個變體也應該有一個關聯的泛型值,用來存放寶藏。 這個值是泛型的,所以寶藏可以是任何東西。

2. 定義 UnlockResult 型別

定義一個有兩個變體的UnlockResult自訂型別。

第一個變體應該是Unlocked,並持有一個泛型值,用來存放寶藏。

第二個變體應該是WrongPassword,不持有任何值。

3. 定義 get_treasure 函式

這個函式應該接受兩個參數

  • 一個TreasureChest泛型自訂型別
  • 一個String(用來嘗試密碼)

這個函式應該拿傳入的密碼嘗試,去比對TreasureChest裡的String。

這個函式應該回傳一個UnlockResult。

如果密碼相符,就回傳帶有TreasureChest中泛型值(也就是寶藏!)的Unlocked。

如果密碼不相符,就回傳WrongPassword。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 寶箱 了嗎?

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