نوع 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"