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