Запис - це колекція полів (які можуть мати різні типи), що повʼязані між собою. Щоб визначити запис, використовують ключове слово 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: відстежуємо команди, тренерів, їхню статистику перемог і поразок та порівнюємо їх між собою.
Оскільки улюбленої команди в нас ще немає, ми також розробимо алгоритм, який допоможе визначити, за яку команду вболівати.
На нас чекає сім завдань, які допоможуть розробити наш власний алгоритм вболівання за команду.
Визначте запис Coach із такими двома полями:
Name: імʼя тренера, типу string.FormerPlayer: указує, чи був тренер колишнім гравцем, типу bool.Визначте запис Stats із такими двома полями:
Wins: кількість перемог, типу int.Losses: кількість поразок, типу int.Визначте запис Team із такими трьома полями:
Name: назва команди, типу string.Coach: тренер команди, типу Coach.Stats: статистика команди, типу Stats.Реалізуйте функцію createCoach, яка приймає імʼя тренера та його статус колишнього гравця як параметри і повертає запис Coach:
createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }
Реалізуйте функцію createStats, яка приймає кількість перемог і кількість поразок як параметри та повертає запис Stats:
createStats 58 24
// => { Wins = 58; Losses = 24 }
Реалізуйте функцію 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 } }
Власники клубів 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 } }
Порпаючись у статистиці, ми ведемо списки команд та їхньої статистики. Іноді ми помиляємося, і в списку виникають дублікати. Реалізуйте функцію 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
Переглянувши багато команд і матчів, ми вигадали алгоритм. Якщо виконується одна з наведених умов, ми вболіваємо за цю команду:
Реалізуйте функцію 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.