۲۸ - ۱آی-او یا IO
باید به خودتون افتخار کنین که تا اینجای کتاب رسیدین. نوکِ انگشتتون مونَد میچرخونین. یه ارتش موند ترانسفورمر رو شکست دادین. راحت از ساختارهای جبری استفاده میکنین. یه درک کلی از نحوهی محاسبهی جملات در هسکل، نااکیدی، و اشتراکگذاری پیدا کردین. حالا با همهی اونها، میریم سراغِ IO
.
در جاهای مختلف کتاب از تایپِ IO
استفاده کردیم، ولی تا اینجا فقط اجمالاً توضیح دادیم. حتماً تا الان متوجه شدین که از این تایپ برای جدا نگه داشتنِ خامه و شکلاتمون از هم استفاده میکنیم – یعنی تابعهای خالصمون رو از اثردارها سَوا میکنیم. شاید براتون سؤال باشه که اصلاً چطور کار میکنه، یا پشت پردهی اون تایپِ مبهم و کِدِر چه خبره. به نظرِ خیلیها IO
مرموز و اسرارآمیزه.
یه تابعِ اثردار، تابعیه که علاوه بر محاسبه و برگردوندنِ جواب، روی محیطی که توش محاسبه میشه، تأثیرِ قابل مشاهده میذاره. نوشتن به خروجیِ استاندارد (مثل putStrLn
)، خوندن از ورودیِ استاندارد (مثل getChar
)، یا تغییرِ حالت به نحوی مخرب (ST
) از مثالهای اثر هستن. از عواقبِ چنین چیزی اینه که تقریباً همیشه باید با ترتیبِ مشخصی محاسبه بشن. بیانیههای غیرِ IO
توی هسکل همیشه یه جواب میدن، ترتیبشون هم مهم نیست؛ اما با معرفیِ IO
، دیگه چنین تضمینی در کار نیست.
بیشترِ توضیحهایی هم که از تایپِ IO
ِ هسکل وجود دارن، کمکِ زیادی نمیکنن. انگار طوری نوشته شدن که خواننده رو بیشتر گیج کنن تا اینکه اطلاعات مفیدی برسونن. احتمالاً همین الان یکی داره IO
رو با موندهای آزادِ ون لارهووِن و همجبرهای همموند ِ همحالت توضیح میده تا مطلبی که خیلی سادهتر از هرکدوم از اونها به تنهاییه برسونه.
ما نمیخوایم از این کارها کنیم. در عوض سعی میکنیم یه کم از مرموز بودنِ IO
کم کنیم. چیزی که مهمه از IO
بدونین اینه که یه نوعداده ِ خاصیه که در بعضی موارد اجازهی اشتراکگذاری نمیده.
در این فصل:
نحوهی کارِ IO
رو از لحاظ عملیاتی توضیح میدیم؛
میبینیم که چه مفهومی باید از تایپی که توش IO
داره برداشت کنین؛
یه کم جزئیاتِ بیشتری از Functor
، Applicative
، و Monad
ِ تایپِ IO
میگیم.