Ein Datensatz ist eine Sammlung von Feldern (die unterschiedliche Typen haben können), die zusammengehören. Um einen Datensatz zu definieren, wird das Schlüsselwort type verwendet. Die Felder eines Datensatzes werden zwischen den Zeichen { und } definiert, und jedes Feld hat einen Namen und einen Typ. Um einen Datensatz zu erstellen, gib die Namen der Felder an und weise ihnen zwischen den Zeichen { und } einen Wert zu. Bei der Erstellung eines Datensatzes müssen alle Felder einen Wert erhalten. Auf die Feldwerte einer Datensatzinstanz kann mit Punktnotation zugegriffen werden.
Beim Definieren oder Erstellen eines Datensatzes muss sich jedes Feld entweder in einer eigenen Zeile befinden oder, wenn es in einer einzigen Zeile steht, durch Semikolons (;) getrennt werden.
// 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 }
Da Datensätze unveränderlich sind, können sich die Feldwerte eines Datensatzes nach seiner Erstellung nie ändern. Wenn du die Werte eines Datensatzes ändern möchtest, kannst du mit dem Schlüsselwort with eine Kopie eines vorhandenen Datensatzes erstellen, allerdings mit neuen Werten für ein oder mehrere Felder.
// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street // => "Main Street"
newAddress.HouseNumber // => 86
Datensätze haben strukturelle Gleichheit, was bedeutet, dass zwei Instanzen desselben Datensatzes mit identischen Werten äquivalent sind.
Neben der Möglichkeit, mit Punktnotation auf die Felder eines Datensatzes zuzugreifen, können Datensätze auch in Bindungen und im Musterabgleich dekonstruiert werden:
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
In dieser Übung bist du ein großer Sportfan und hast gerade deine Leidenschaft für NBA-Basketball entdeckt. Da du neu im NBA-Basketball bist, tauchst du tief in die NBA-Geschichte ein, behältst Teams, Trainer und ihre Sieg-/Niederlagen-Statistiken im Blick und vergleichst sie miteinander.
Da du noch kein Lieblingsteam hast, entwickelst du außerdem einen Algorithmus, der herausfindet, ob du für ein bestimmtes Team die Daumen drücken solltest.
Sieben Aufgaben helfen dir dabei, deinen ganz eigenen Root-for-a-Team-Algorithmus zu entwickeln.
Definiere den Record Coach mit den folgenden zwei Feldern:
Name: der Name des Trainers, vom Typ string.FormerPlayer: gibt an, ob der Trainer früher selbst Spieler war, vom Typ bool.Definiere den Record Stats mit den folgenden zwei Feldern:
Wins: die Anzahl der Siege, vom Typ int.Losses: die Anzahl der Niederlagen, vom Typ int.Definiere den Record Team mit den folgenden drei Feldern:
Name: der Name des Teams, vom Typ string.Coach: der Trainer des Teams, vom Typ Coach.Stats: die Statistiken des Teams, vom Typ Stats.Implementiere die Funktion createCoach, die den Namen des Trainers und seinen Status als ehemaliger Spieler als Parameter entgegennimmt und den Record Coach zurückgibt:
createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }
Implementiere die Funktion createStats, die die Anzahl der Siege und die Anzahl der Niederlagen als Parameter entgegennimmt und den Record Stats zurückgibt:
createStats 58 24
// => { Wins = 58; Losses = 24 }
Implementiere die Funktion createTeam, die den Teamnamen, den Trainer und den Record als Parameter entgegennimmt und den Record Team zurückgibt:
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-Besitzer sind ungeduldig, und du hast festgestellt, dass schlechte Ergebnisse eines Teams oft dazu führen, dass der Trainer ersetzt wird. Implementiere die Funktion replaceCoach, die das Team und seinen neuen Trainer als Parameter entgegennimmt und das Team mit dem neuen Trainer zurückgibt:
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 } }
Während du dich mit Statistiken beschäftigst, führst du Listen von Teams und ihren Records. Manchmal machst du dabei Fehler, und dann stehen doppelte Einträge auf deiner Liste. Implementiere die Funktion isSameTeam, die zwei Teams entgegennimmt und true zurückgibt, wenn es dasselbe Team ist; andernfalls gibst du false zurück:
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
Nachdem du viele Teams und Spiele analysiert hast, hast du einen Algorithmus entwickelt. Wenn eine der folgenden Bedingungen zutrifft, drückst du diesem Team die Daumen:
Implementiere die Funktion rootForTeam, die ein Team entgegennimmt und true zurückgibt, wenn du für dieses Team die Daumen drücken solltest; andernfalls gibst du return zurück:
let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.