۶ - ۱۱تایپکلاس 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 یه تابعِ ناقص ِه، یه تابعی که به ازای همهی ورودیهای ممکن خروجیِ صحیحی نمیده. راههایی برای جمعوجور کردن این مورد وجود داره که بعداً نشون میدیم. ولی همیشه باید تلاش کنیم که از چنین توابعی پرهیز کنیم، چون هسکل ابزار لازم برای دوری از اینجور خطاهای بیخودی رو در اختیار میذاره.