Μια έκφραση if/elif/else μπορεί να χρησιμοποιηθεί για να εκτελέσεις λογική υπό συνθήκη. Η F# έχει όμως και έναν άλλο, πιο ισχυρό τρόπο για να εκτελείς λογική υπό συνθήκη: την αντιστοίχιση προτύπων. Με την αντιστοίχιση προτύπων, μια τιμή μπορεί να ελεγχθεί ως προς ένα ή περισσότερα πρότυπα. Ένα παράδειγμα τέτοιου προτύπου είναι το σταθερό πρότυπο, το οποίο αντιστοιχίζει μια τιμή με μια σταθερά (π.χ. 1 ή "hello").
Στην F#, η αντιστοίχιση προτύπων γίνεται με τη λέξη-κλειδί match:
let describe number =
match number with
| 0 -> "Zero"
| 1 -> "One"
Αν και αυτό μπορεί να μοιάζει με εντολές switch σε άλλες γλώσσες, η αντιστοίχιση προτύπων αρχίζει να λάμπει όταν χρησιμοποιείς και άλλα πρότυπα. Ένα τέτοιο πρότυπο είναι το πρότυπο μεταβλητής, το οποίο σου επιτρέπει να συλλάβεις μια τιμή:
match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i
Σε ορισμένες περιπτώσεις, μπορεί να θέλεις να προσθέσεις μια επιπλέον συνθήκη σε ένα πρότυπο. Αυτό είναι γνωστό ως φρουρός (ρήτρα), ο οποίος μπορεί να προστεθεί με τη λέξη-κλειδί when:
match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"
Στο παραπάνω παράδειγμα, δεν θα αντιστοιχιστεί κάθε πιθανή είσοδος με κάποιο πρότυπο. Ο μεταγλωττιστής θα το εντοπίσει και θα εμφανίσει μια προειδοποίηση. Αυτό είναι γνωστό ως εξαντλητικός έλεγχος. Για να λύσεις την προειδοποίηση, πρέπει να χειριστείς όλες τις περιπτώσεις. Γι' αυτό μπορείς να χρησιμοποιήσεις το πρότυπο μπαλαντέρ, ένα πρότυπο που ταιριάζει με οποιαδήποτε τιμή:
match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"
// No compiler warning
Η αντιστοίχιση προτύπων ελέγχει μια τιμή ως προς κάθε πρότυπο από πάνω προς τα κάτω, μέχρι να βρει ένα πρότυπο που ταιριάζει και να εκτελέσει τη λογική που σχετίζεται με αυτό το πρότυπο. Η σειρά των προτύπων έχει σημασία!
Σε αυτή την άσκηση, παίζεις ένα παιχνίδι μαντεψιάς αριθμών με έναν φίλο σου. Οι κανόνες είναι απλοί: διαλέγεις κρυφά έναν αριθμό ανάμεσα στο 1 και στο 100 και ο φίλος σου προσπαθεί να μαντέψει ποιον αριθμό διάλεξες. Για να βοηθήσεις τον φίλο σου, απαντάς διαφορετικά ανάλογα με το πόσο κοντά ήταν η μαντεψιά στον αριθμό που διάλεξες (42). Αυτοί είναι οι κανόνες για τις διάφορες απαντήσεις:
42: "Correct"41 ή 43: "So close"41: "Too low"43: "Too high"Έχεις τέσσερις εργασίες για να κωδικοποιήσεις τις απαντήσεις στις μαντεψιές.
Υλοποίησε τη συνάρτηση reply για να απαντήσεις σε μια σωστή μαντεψιά:
reply 42
// => "Correct"
Τροποποίησε τη συνάρτηση reply για να απαντήσεις σε κοντινές μαντεψιές:
reply 41
// => "So close"
Τροποποίησε τη συνάρτηση reply για να απαντήσεις σε πολύ χαμηλές μαντεψιές:
reply 25
// => "Too low"
Τροποποίησε τη συνάρτηση reply για να απαντήσεις σε πολύ υψηλές μαντεψιές:
reply 88
// => "Too high"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις F# με 18 έννοιες148 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.