跟風者

跟風者

學習練習

簡介

標籤欄位

當自訂型別的變體帶有資料時,就稱為記錄,其中所含的每個值都存放在一個_欄位_裡。

pub type Rectangle {
  Rectangle(
    Float, // The first field
    Float, // The second field
  )
}

為了提升可讀性,Gleam 允許替欄位標上名稱。

pub type Rectangle {
  Rectangle(
    width: Float,
    height: Float,
  )
}

標籤可以用來以任意順序把引數傳給記錄的建構子。

let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)

a == b
// -> True

當自訂型別只有一個變體時,就能用.label存取子語法取得記錄的欄位。

let rect = Rectangle(height: 10.0, width: 20.0)

rect.height // -> 10.0
rect.width  // -> 20.0

當自訂型別只有單一變體時,可以使用記錄更新語法,從既有的記錄建立新的記錄,並把其中部分欄位換成新的值。

let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)

tall_rect.height // -> 50.0
tall_rect.width  // -> 20.0

標籤也可以在模式匹配時使用,從記錄中取出值。

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, width: _) if h >. 20.0 -> True
    _ -> False
  }
}

如果只想匹配其中幾個欄位,可以用展開運算子..忽略其餘欄位。

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, ..) if h >. 20.0 -> True
    _ -> False
  }
}

說明

在這道練習中,你是個超級運動迷,而且剛剛發現自己對 NBA 籃球充滿熱情。由於剛接觸 NBA 籃球,你正深入研究 NBA 的歷史,追蹤球隊、教練以及他們的勝敗戰績,並互相比較。

由於你還沒有最愛的球隊,你也會開發一套演算法,判斷是否該支持某支特定的球隊。

你有七個任務,幫助你開發出自己專屬的「支持某支球隊」演算法。

1. 定義模型

定義Coach記錄,包含以下兩個欄位:

  • name:教練的名字,型別為String。
  • former_player:指出這位教練是否曾是球員,型別為Bool。

定義Stats記錄,包含以下兩個欄位:

  • wins:勝場數,型別為Int。
  • losses:敗場數,型別為Int。

定義Team記錄,包含以下三個欄位:

  • name:球隊的名字,型別為String。
  • coach:球隊的教練,型別為Coach。
  • stats:球隊的統計資料,型別為Stats。

2. 建立球隊的教練

實作create_coach函式,接受教練的名字與他是否曾是球員作為參數,並回傳Coach記錄:

create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)

3. 建立球隊的統計資料

實作create_stats函式,接受勝場數與敗場數作為參數,並回傳Stats記錄:

create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)

4. 建立球隊

實作create_team函式,接受球隊的名字、教練與記錄作為參數,並回傳Team記錄:

let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Larry Bird", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

5. 替換教練

NBA 球隊的老闆沒什麼耐性,你發現球隊戰績不佳時,教練往往會因此被換掉。實作replace_coach函式,接受球隊與新教練作為參數,並回傳換上新教練後的球隊:

let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)

let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

6. 檢查是否為同一支球隊

在研究統計資料的過程中,你會持續記錄球隊及其戰績的清單。有時候你會出錯,清單上出現重複的項目。實作is_same_team函式,接受兩支球隊,若兩者為同一支球隊則回傳True,否則回傳False:

let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)

let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)

is_same_team(pacers_team, lakers_team)
// -> False

7. 檢查你是否該支持某支球隊

看過許多球隊和比賽之後,你想出了一套演算法。若下列其中一項為 True,你就支持那支球隊:

  • 教練的名字是 "Gregg Popovich"
  • 教練曾是球員
  • 球隊的名字是 "Chicago Bulls"
  • 球隊贏了 60 場以上的比賽
  • 球隊的敗場數多於勝場數

實作root_for_team函式,接受一支球隊,若你應該支持該球隊則回傳True,否則回傳False:

let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 跟風者 了嗎?

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