يتيح النوع Result للدالة أن تُرجع قيمة واحدة تشير إلى كل ما يلي:
النوع Result هو نوع عام يضم نوعين أساسيين:
النوع Result هو أيضًا [اتحاد مميز][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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.