Μια καταγραφή είναι μια συλλογή από πεδία (τα οποία μπορούν να είναι διαφορετικών τύπων) που ανήκουν μαζί. Για να ορίσεις μια καταγραφή χρησιμοποιείται η λέξη-κλειδί 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.