Ο τύπος Result δίνει τη δυνατότητα σε μια συνάρτηση να επιστρέφει μία μόνο τιμή που δηλώνει όλα τα παρακάτω:
Ο τύπος Result είναι ένας γενικός τύπος που περιέχει δύο υποκείμενους τύπους:
Ο τύπος Result είναι επίσης μια [discriminated union][discriminated-union] με τις εξής δυνατές περιπτώσεις:
Ok <value> που αντιπροσωπεύει ένα επιτυχημένο αποτέλεσμαError <reason> που αντιπροσωπεύει μια αποτυχίαΗ παρακάτω συνάρτηση δείχνει πώς να δημιουργήσεις μια τιμή Result:
let validateName (name: string) : Result<string, string> =
match name with
| null -> Error "Name not found."
| "" -> Error "Name is empty."
| _ -> Ok name
Σε αυτό το παράδειγμα, η τιμή Ok είναι μια συμβολοσειρά (το όνομα που δόθηκε), και η τιμή Error είναι επίσης μια συμβολοσειρά (η αιτία του σφάλματος, σε μορφή κατανοητή από τον άνθρωπο).
Result
Θεώρησε τον παρακάτω ορισμό τύπου και την υπογραφή της συνάρτησης:
type FileOpenError =
| NotFound
| AccessDenied
| FileLocked
let openFile (filename: string) : Result<int, FileOpenError> =
Ο κώδικας που καλεί τη συνάρτηση openFile μπορεί να χρησιμοποιήσει αντιστοίχιση προτύπων για να χειριστεί τις περιπτώσεις επιτυχίας και αποτυχίας, όπως στο παρακάτω παράδειγμα:
match openFile(filename) with
| Ok handle -> doSomethingWithFile(handle)
| Error NotFound -> printfn $"Error: file {filename} was not found."
| Error AccessDenied -> printfn $"Error: you do not have permission to open the file {filename}."
| Error FileLocked -> printfn $"Error: file {filename} is already in use."
Ο στόχος σου είναι να δημιουργήσεις έναν ελεγκτή κωδικού πρόσβασης. Ένας ελεγκτής κωδικού πρόσβασης επικυρώνει τον κωδικό πρόσβασης που προτείνει ένας χρήστης, ώστε να βεβαιωθεί ότι πληροί ένα σύνολο απαιτήσεων που ορίζει ο οργανισμός που ελέγχει την πρόσβαση στον συγκεκριμένο πόρο.
Για αυτή την άσκηση, οι απαιτήσεις για τον κωδικό πρόσβασης είναι:
Η λύση σου πρέπει να χρησιμοποιεί ένα Result για να ενσωματώνει την κατάσταση επιτυχίας ή αποτυχίας.
Στην περίπτωση επιτυχίας, το Result πρέπει να μεταφέρει τον επικυρωμένο κωδικό πρόσβασης ως συμβολοσειρά.
Στην περίπτωση αποτυχίας, το Result πρέπει να μεταφέρει τον κανόνα που παραβιάστηκε.
Για αυτή την άσκηση, ο ελεγκτής κωδικού πρόσβασης θα είναι απλοϊκός: θα υποδεικνύει μόνο πότε έχει παραβιαστεί ένας μόνο κανόνας. Μια επόμενη άσκηση θα εξετάσει έναν πιο ρεαλιστικό ελεγκτή κωδικού πρόσβασης, που μπορεί να υποδεικνύει πότε έχουν παραβιαστεί πολλοί κανόνες ταυτόχρονα.
checkPassword
Η συνάρτηση checkPassword ελέγχει τον κωδικό πρόσβασης που δίνεται με βάση τους προαναφερθέντες κανόνες. Σε περίπτωση αποτυχίας, υποδεικνύει τον κανόνα που παραβιάστηκε, ενσωματώνοντας μία από τις τιμές του PasswordRule στην τιμή του αποτελέσματος.
checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter
Η συνάρτηση getStatusMessage επιστρέφει μια συμβολοσειρά που περιέχει ένα μήνυμα αναγνώσιμο από τον άνθρωπο, το οποίο δηλώνει το νόημα του αποτελέσματος που επιστρέφει η checkPassword.
getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις F# με 18 έννοιες148 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.