پرش به محتویات

Result

نوع داده Maybe می‌تواند در توابع ساده‌ای که ممکن است شکست بخورند مفید باشد، اما به شما نمی‌گوید چرا شکست خورده است. تصور کنید که یک کامپایلر، هنگام بروز اشتباه در برنامه، فقط بگوید Nothing. ببینم چطور می‌خواهید اشتباه را پیدا کنید!

اینجاست که نوع داده Result بکار می‌آید. این نوع داده، به صورت زیر تعریف شده است:

type Result error value
  = Err error
  | Ok value

هدف از این نوع داده، ارایه اطلاعات اضافی در زمان بروز خطا است. این حالت، برای گزارش خطا و بازیابی خطا بسیار مفید است!

گزارش خطا

شاید وبسایتی داشته باشیم که در آن کاربران سن خود را وارد می‌کنند. برای بررسی معقول بودن ورودی کاربر، می‌توانیم از تابعی مانند این استفاده کنیم:

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 روبرو خواهیم شد!