Result¶
نوع داده Maybe
میتواند در توابع سادهای که ممکن است شکست بخورند مفید باشد، اما به شما نمیگوید چرا شکست خورده است. تصور کنید که یک کامپایلر، هنگام بروز اشتباه در برنامه، فقط بگوید Nothing
. ببینم چطور میخواهید اشتباه را پیدا کنید!
اینجاست که نوع داده Result
بکار میآید. این نوع داده، به صورت زیر تعریف شده است:
هدف از این نوع داده، ارایه اطلاعات اضافی در زمان بروز خطا است. این حالت، برای گزارش خطا و بازیابی خطا بسیار مفید است!
گزارش خطا¶
شاید وبسایتی داشته باشیم که در آن کاربران سن خود را وارد میکنند. برای بررسی معقول بودن ورودی کاربر، میتوانیم از تابعی مانند این استفاده کنیم:
isReasonableAge : String -> Result String Int
isReasonableAge input =
case String.toInt input of
Nothing ->
Err "That is not a number!"
Just age ->
if age < 0 then
Err "Please try again after you are born."
else if age > 135 then
Err "Are you some kind of turtle?"
else
Ok age
-- isReasonableAge "abc" == Err ...
-- isReasonableAge "-13" == Err ...
-- isReasonableAge "24" == Ok 24
-- isReasonableAge "150" == Err ...
نه تنها میتوانیم سن را بررسی کنیم، بلکه پیامهای خطا را بسته به جزییات ورودی نشان میدهیم. این نوع بازخورد، بسیار بهتر از Nothing
است!
بازیابی خطا¶
نوع داده Result
همچنین میتواند در بازیابی از خطا کمک کند. یکی از جاهایی که این را میبینید، هنگام انجام درخواست HTTP است. فرض کنید میخواهیم متن کامل کتاب آنا کارِنینا اثر لئو تولستوی را نمایش دهیم. نتیجه درخواست HTTP یک Result Error String
است تا این واقعیت را که درخواست ممکن است با متن کامل کتاب موفق شود یا به روشهای مختلفی شکست بخورد، ثبت کند:
type Error
= BadBody String
| BadStatus Int
| BadUrl String
| NetworkError
| Timeout
-- Ok "All happy ..." : Result Error String
-- Err Timeout : Result Error String
-- Err NetworkError : Result Error String
در ادامه، میتوانیم پیامهای خطای بهتری را که قبلا بحث کردیم نمایش دهیم، اما همچنین میتوانیم سعی کنیم خطا را بازیابی کنیم! اگر یک Timeout
ببینیم، ممکن است با کمی صبر و تلاش، برطرف شود. در حالی که اگر یک BadStatus 404
ببینیم، دیگر هیچ دلیلی برای تلاش دوباره وجود ندارد.
فصل بعدی نشان میدهد که چگونه درخواست HTTP انجام دهیم، بنابراین بزودی با نوع داده Result
و Error
روبرو خواهیم شد!