Μια πλειάδα είναι μια αμετάβλητη ομαδοποίηση ανώνυμων αλλά διατεταγμένων τιμών. Οι πλειάδες μπορούν να περιέχουν οποιονδήποτε ή πολλαπλούς τύπους δεδομένων, ακόμη και άλλες πλειάδες.
Οι πλειάδες ορίζονται ως τιμές χωρισμένες με κόμμα ανάμεσα στους χαρακτήρες ( και ): (<element_1>, ... , <element_n>).
("one", 2) // Tuple pair (2 values)
("one", 2, true) // Tuple triplet (3 values)
Μόνο πλειάδες με το ίδιο μήκος και τους ίδιους τύπους (με την ίδια σειρά) μπορούν να συγκριθούν. Οι πλειάδες έχουν δομική ισότητα, που σημαίνει ότι είναι ίσες μόνο αν όλες οι τιμές τους είναι ίσες.
(1, 2) = (1, 2) // Same length, same types, same values, same order
// => true
(1, 2) = (2, 1) // Same length, same types, same values, different order
// => false
(1, 2) = (1, "2") // Same length, different types
// compiler error
(1, 2) = (1, 2, 3) // Different length
// compiler error
Υπάρχουν τρεις τρόποι με τους οποίους μπορείς να εξαγάγεις τιμές από μια πλειάδα:
fst και snd
let person = ("Jordan", 170)
// Option 1: fst/snd
let name1 = fst person
let length2 = snd person
// Option 2: deconstruction
let (name2, length2) = person
// => name2 = "Jordan"
// => length2 = 170
// Option 3: pattern matching
match person with
| name3, length3 -> printf "%s: %d" name3 length3
Η Azara και ο Rui είναι συμπαίκτες σε ένα κυνήγι θησαυρού με πειρατικό θέμα. Ο ένας έχει μια λίστα με θησαυρούς και τις συντεταγμένες τους στον χάρτη, ο άλλος μια λίστα με ονόματα τοποθεσιών και τις συντεταγμένες τους. Τους έχουν δώσει επίσης κενούς χάρτες με ένα σημείο εκκίνησης που γράφει ΒΡΙΣΚΕΣΑΙ ΕΔΩ.
| Η λίστα της Azara | Η λίστα του Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Τα πράγματα όμως είναι λίγο ακατάστατα: οι συντεταγμένες της Azara φαίνεται να είναι μορφοποιημένες και ταξινομημένες διαφορετικά από του Rui, και πρέπει να κοιτάζουν συνεχώς από τη μια λίστα στην άλλη για να καταλάβουν ποιοι θησαυροί πάνε με ποιες τοποθεσίες. Καθώς είναι επίδοξοι fsharpies, ήρθαν σε σένα για βοήθεια, να γράψεις ένα μικρό πρόγραμμα (μια σειρά από συναρτήσεις, στην πραγματικότητα) για να οργανώσουν καλύτερα τις πληροφορίες του κυνηγιού τους.
Υλοποίησε τη συνάρτηση getCooordinate() που παίρνει ένα ζεύγος (treasure, coordinate) από τη λίστα της Azara και επιστρέφει μόνο τη συντεταγμένη του χάρτη που εξάγεται.
getCoordinate ("Scrimshaw Whale's Tooth", "2A")
// "2A"
Υλοποίησε τη συνάρτηση convertCoordinate() που παίρνει μια συντεταγμένη στη μορφή "2A" και επιστρέφει μια πλειάδα στη μορφή (2, 'A').
convertCoordinate "2A"
// (2, 'A')
Υλοποίησε τη συνάρτηση compareRecords() που παίρνει ένα ζεύγος (treasure, coordinate) και μια καταγραφή (location, coordinate, quadrant) και συγκρίνει τις συντεταγμένες από τη μία και την άλλη.
Επίστρεψε true αν οι συντεταγμένες "ταιριάζουν", και επίστρεψε false αν δεν ταιριάζουν.
Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για ακριβή σύγκριση.
compareRecords ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "blue")
// false
compareRecords ("Model Ship in Large Bottle", "8A") ("Harbor Managers Office", (8, 'A'), "purple")
// true
Υλοποίησε τη συνάρτηση createrecord() που παίρνει ένα ζεύγος (treasure, coordinate) από τη λίστα της Azara και μια καταγραφή (location, coordinate, quadrant) από τη λίστα του Rui και επιστρέφει (coordinate, location, quadrant, treasure) αν οι συντεταγμένες ταιριάζουν.
Αν οι συντεταγμένες δεν ταιριάζουν, επίστρεψε μια πλειάδα με την ίδια μορφή αλλά γεμάτη με "".
Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για ακριβή σύγκριση.
createRecord ("Brass Spyglass", "4B") ("Abandoned Lighthouse", (4, 'B'), "Blue")
// ("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
createRecord ("Brass Spyglass", "4B") ("Seaside Cottages", (1, 'C'), "Blue")
// ("", "", "", "")
Γράψου στο Exercism για να μάθεις και να κατακτήσεις F# με 18 έννοιες148 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.