A rekord olyan mezők gyűjteménye, amelyek összetartoznak, és amelyek akár különböző típusúak is lehetnek. Rekord definiálásához a type kulcsszót használjuk. A rekord mezőit a { és } karakterek között definiáljuk, és minden mezőnek van egy neve és egy típusa. Rekord létrehozásához megadjuk a mezők nevét, majd a { és } karakterek között értéket rendelünk hozzájuk. Rekord létrehozásakor minden mezőnek értéket kell adni. Egy rekordpéldány mezőértékei pontjelöléssel érhetők el.
Rekord definiálásakor/létrehozásakor minden mezőnek vagy külön sorban kell lennie, vagy pontosvesszővel (;) elválasztva, ha egy sorban van.
// 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 }
Mivel a rekordok nem módosíthatók, miután létrehoztunk egy rekordot, a mezőértékei soha nem változhatnak. Ha szeretnéd módosítani egy rekord értékeit, a with kulcsszóval készíthetsz egy másolatot egy létező rekordról, de egy vagy több mező új értékével.
// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street // => "Main Street"
newAddress.HouseNumber // => 86
A rekordok strukturális egyenlőséggel rendelkeznek, ami azt jelenti, hogy ugyanazon rekord két azonos értékű példánya egyenértékű.
Amellett, hogy pontjelöléssel hozzáférhetsz egy rekord mezőihez, a rekordok kötésekben és mintaillesztésben is szétbonthatók:
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
Ebben a feladatban nagy sportrajongó vagy, és most fedezted fel, hogy mennyire vonz az NBA-kosárlabda. Mivel még új vagy az NBA kosárlabdájában, alaposan elmélyedsz az NBA történetében: számon tartod a csapatokat, az edzőket és a győzelmi/vereségi statisztikáikat, és összehasonlítod őket egymással.
Mivel még nincs kedvenc csapatod, egy algoritmust is fejlesztesz majd, amivel eldöntheted, hogy szurkolj-e egy adott csapatnak.
Hét részfeladat segít kidolgozni a saját szurkolj-egy-csapatért algoritmusodat.
Definiáld a Coach rekordot a következő két mezővel:
Name: az edző neve, típusa string.FormerPlayer: megmutatja, hogy az edző korábban játékos volt-e, típusa bool.Definiáld a Stats rekordot a következő két mezővel:
Wins: a győzelmek száma, típusa int.Losses: a vereségek száma, típusa int.Definiáld a Team rekordot a következő három mezővel:
Name: a csapat neve, típusa string.Coach: a csapat edzője, típusa Coach.Stats: a csapat statisztikái, típusa Stats.Valósítsd meg a createCoach függvényt, amely paraméterként az edző nevét és a korábbi játékos státuszát kapja, és visszaadja a Coach rekordot:
createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }
Valósítsd meg a createStats függvényt, amely paraméterként a győzelmek és a vereségek számát kapja, és visszaadja a Stats rekordot:
createStats 58 24
// => { Wins = 58; Losses = 24 }
Valósítsd meg a createTeam függvényt, amely paraméterként a csapat nevét, az edzőt és a rekordot kapja, és visszaadja a Team rekordot:
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 } }
Mivel az NBA tulajdonosai türelmetlenek, azt tapasztaltad, hogy a rossz csapateredmények gyakran az edző lecseréléséhez vezetnek. Valósítsd meg a replaceCoach függvényt, amely paraméterként a csapatot és az új edzőt kapja, és visszaadja a csapatot, de már az új edzővel:
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 } }
Miközben a statisztikákat elemzed, csapatok és rekordjaik listáit vezeted. Néha hibázol, és ilyenkor duplikált bejegyzések kerülnek a listádra. Valósítsd meg az isSameTeam függvényt, amely két csapatot kap, és true-t ad vissza, ha ugyanaz a csapat; egyébként false-t ad vissza:
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
Miután sok csapatot és mérkőzést megvizsgáltál, kitaláltál egy algoritmust. Ha az alábbiak közül valamelyik igaz, szurkolsz annak a csapatnak:
Valósítsd meg a rootForTeam függvényt, amely egy csapatot kap, és true-t ad vissza, ha szurkolni kell annak a csapatnak; egyébként return false:
let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) F# nyelvet 18 fogalom148 feladat segítségével, valódi emberi mentorálással, mindez ingyen.