Треки
/
F#
F#
/
Вправи
/
Попутник
Попутник

Попутник

Навчальна вправа

Вступ

Записи

Запис - це колекція полів (які можуть мати різні типи), що повʼязані між собою. Щоб визначити запис, використовують ключове слово type. Поля запису визначають між символами { і }, і кожне поле має назву і тип. Щоб створити запис, потрібно вказати назви полів і присвоїти їм значення між символами { і }. Під час створення запису всім полям потрібно присвоїти значення. До значень полів екземпляра запису можна звертатися за допомогою точкової нотації.

Коли ми визначаємо або створюємо запис, кожне поле має бути або на окремому рядку, або відокремлене крапками з комою (;), якщо весь запис розміщено в одному рядку.

// Define a record
type Address =
    { Street: string
      HouseNumber: int }

// Create a record
let oldAddress: Address =
    { Street = "Main Street"
      HouseNumber = 17 }

// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }

Оскільки записи незмінні, після створення запису його значення полів більше не можуть змінитися. Якщо ми хочемо змінити значення запису, ключове слово with дає змогу створити копію наявного запису, але з новими значеннями для одного або кількох полів.

// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street      // => "Main Street"
newAddress.HouseNumber // => 86

Записи мають структурну рівність, а це означає, що два екземпляри одного запису з однаковими значеннями еквівалентні.

Окрім можливості використовувати точкову нотацію для доступу до полів запису, записи також можна деконструювати у привʼязках і зіставленні зі зразком:

let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress

match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway

Вказівки

У цій вправі ми палко вболіваємо за спорт і щойно відкрили для себе баскетбол NBA. Оскільки баскетбол NBA для нас новий, ми глибоко занурюємося в історію NBA: відстежуємо команди, тренерів, їхню статистику перемог і поразок та порівнюємо їх між собою.

Оскільки улюбленої команди в нас ще немає, ми також розробимо алгоритм, який допоможе визначити, за яку команду вболівати.

На нас чекає сім завдань, які допоможуть розробити наш власний алгоритм вболівання за команду.

1. Визначте модель

Визначте запис Coach із такими двома полями:

  • Name: імʼя тренера, типу string.
  • FormerPlayer: указує, чи був тренер колишнім гравцем, типу bool.

Визначте запис Stats із такими двома полями:

  • Wins: кількість перемог, типу int.
  • Losses: кількість поразок, типу int.

Визначте запис Team із такими трьома полями:

  • Name: назва команди, типу string.
  • Coach: тренер команди, типу Coach.
  • Stats: статистика команди, типу Stats.

2. Створіть тренера команди

Реалізуйте функцію createCoach, яка приймає імʼя тренера та його статус колишнього гравця як параметри і повертає запис Coach:

createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }

3. Створіть статистику команди

Реалізуйте функцію createStats, яка приймає кількість перемог і кількість поразок як параметри та повертає запис Stats:

createStats 58 24
// => { Wins = 58; Losses = 24 }

4. Створіть команду

Реалізуйте функцію createTeam, яка приймає назву команди, тренера та статистику як параметри і повертає запис Team:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Larry Bird"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

5. Замініть тренера

Власники клубів NBA нетерплячі, тож ми помітили, що погані результати команди часто призводять до заміни тренера. Реалізуйте функцію replaceCoach, яка приймає команду та її нового тренера як параметри й повертає команду, але вже з новим тренером:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record

let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

6. Перевірте, чи це та сама команда

Порпаючись у статистиці, ми ведемо списки команд та їхньої статистики. Іноді ми помиляємося, і в списку виникають дублікати. Реалізуйте функцію isSameTeam, яка приймає дві команди й повертає true, якщо це та сама команда, інакше повертає false:

let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats

let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats

isSameTeam pacersTeam lakersTeam
// => false

7. Перевірте, чи варто вболівати за команду

Переглянувши багато команд і матчів, ми вигадали алгоритм. Якщо виконується одна з наведених умов, ми вболіваємо за цю команду:

  • Імʼя тренера — «Gregg Popovich»
  • Тренер — колишній гравець
  • Назва команди — «Chicago Bulls»
  • Команда здобула 60 або більше перемог
  • У команди більше поразок, ніж перемог

Реалізуйте функцію rootForTeam, яка приймає команду й повертає true, якщо за цю команду варто вболівати, інакше return false:

let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
F# Exercism

Час розпочати Попутник?

Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.