Διαδρομές
/
F#
F#
/
Ύλη
/
Αντιστοίχιση προτύπων
Αν

Αντιστοίχιση προτύπων σε F#

1 άσκηση

Σχετικά με την έννοια Αντιστοίχιση προτύπων

Μια έκφραση 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"

Μια ρήτρα φρουρός μπορεί να είναι οποιαδήποτε έγκυρη έκφραση, η οποία περιλαμβάνει την κλήση συναρτήσεων.

Στο παραπάνω παράδειγμα, δεν θα έχουν όλες οι πιθανές είσοδοι ένα πρότυπο που να ταιριάζει. Ο μεταγλωττιστής θα το εντοπίσει και θα εκδώσει μια προειδοποίηση. Αυτό είναι γνωστό ως εξαντλητική αντιστοίχιση. Για να λύσεις την προειδοποίηση, πρέπει να χειριστείς όλες τις περιπτώσεις. Για αυτό, μπορεί να χρησιμοποιηθεί το [πρότυπο μπαλαντέρ][wildcard-pattern], το οποίο είναι ένα πρότυπο που ταιριάζει με οποιαδήποτε τιμή:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

Σημείωσε ότι ο μεταγλωττιστής δεν μπορεί να χρησιμοποιήσει ρήτρες when για να συμπεράνει την εξαντλητικότητα:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

Η αντιστοίχιση προτύπων ελέγχει μια τιμή ως προς κάθε πρότυπο από πάνω προς τα κάτω, μέχρι να βρει ένα πρότυπο που ταιριάζει και να εκτελέσει τη λογική που σχετίζεται με αυτό το πρότυπο. Η σειρά των προτύπων έχει σημασία! Επομένως, το πρότυπο απόρριψης πρέπει να είναι πάντα το τελευταίο πρότυπο σε μια έκφραση match.

Αν και η αντιστοίχιση προτύπων είναι πολύ ισχυρή, η απλή λογική υπό συνθήκη μπορεί συνήθως να εκφραστεί πιο καθαρά χρησιμοποιώντας μια έκφραση if/else:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Αντιστοίχιση προτύπων