۶ - ۱۱تایپکلاس Read

چی بگیم... تایپکلاسِ ‏‎Read‎‏... وجود داره. مثل ‏‎Show‎‏، خیلی از تایپ‌ها نمونه ِ ‏‎Read‎‏ هم دارن. این تایپکلاس اساساً برعکس ‏‎Show‎‏ کار می‌کنه. ‏‎Show‎‏ چیزهای مختلف رو به نوشته‌هایی که به دردِ آدم بخوره تبدیل می‌کنه، ‏‎Read‎‏ نوشته‌ها رو به چیزهای مختلف. این هم مثل ‏‎Show‎‏ یه فرمت برای سریال‌سازی نیست. تا اینجا به نظر خوب میاد... پس چرا اولِ فصل اونطور علیهِ ‏‎Read‎‏ گفتیم؟

مشکل در تایپِ ‏‎String‎‏ ِه. ‏‎String‎‏ یه لیسته، که گاهی اوقات ممکنه خالی باشه، گاهی اوقات هم ممکنه تا بینهایت بره.

با بررسی تایپ‌ها شروع به درک این مسئله می‌کنیم:

Prelude> :t read
read :: Read a => String -> a

اصلاً امکان نداره ‏‎Read a => String -> a‎‏ همیشه کار کنه. مثلاً تایپِ ‏‎Integer‎‏ رو ببینیم که نمونه ِ ‏‎Read‎‏ داره. به هیچ وجه تضمینی وجود نداره که ‏‎String‎‏ ِمون نوشته‌ی معتبری از یه مقدارِ ‏‎Integer‎‏ باشه. یه مقدارِ ‏‎String‎‏ می‌تونه هر نوشته ای باشه. یعنی تایپ خیلی بزرگیه که بخوایم به اعداد پارس کنیم! اثباتِ‌ش تو REPL آسونه:

Prelude> read "1234567" :: Integer
1234567
Prelude> read "BLAH" :: Integer
*** Exception: Prelude.read: no parse

اون استثنا یه خطای زمان اجرا هست، یعنی ‏‎read‎‏ یه تابعِ ناقص ِه، یه تابعی که به ازای همه‌ی ورودی‌های ممکن خروجیِ صحیحی نمیده. راه‌هایی برای جمع‌وجور کردن این مورد وجود داره که بعداً نشون میدیم. ولی همیشه باید تلاش کنیم که از چنین توابعی پرهیز کنیم، چون هسکل ابزار لازم برای دوری از اینجور خطاهای بی‌خودی رو در اختیار میذاره.