۲ - ۲تعامل با کد هسکل
هسکل دو راهِ اصلی برای کار با کد در اختیار میذاره. اولی نوشتنِ کد مستقیماً تو محیط تعاملی ِ هسکل به اسم GHCi یا REPL ِه. راه دوم نوشتنِ کد به کمک یه برنامهی ویرایش متن توی یه فایل، و بعد بارگذاریِ اون فایل تو GHCi ِه. این بخشِ کتاب هر دو راه رو معرفی میکنه.
استفاده از REPL
REPL مخفف read-eval-print loop ِه، که به ترتیب میشه: خوندن، محاسبه، چاپ، تکرار. REPL ها محیطهای برنامهنویسیِ تعاملیاند که میتونین کدتون رو وارد کنین و نتیجهش رو بعد از محاسبه ببینید. اولین زبانی که چنین محیطی داشت Lisp بود، ولی الان اکثر زبانهای مدرن، REPL دارن.
اگه هسکل رو نصب کرده باشین، باید بتونین از terminal (یا command prompt در ویندوز) اجراش کنین. وقتی تایپ کنید ghci
یا stack ghci
*، و enter رو بزنین، باید یه پیغامی مثل این ببینید:
GHCi, version 7.10.3:
http://www.haskell.org/ghc/ :? for help
Prelude>
اگه GHC رو خارج از Stack نصب کردین، نوشتنِ ghci
ِخالی اجراش میکنه. ولی اگه تنها GHC ای که دارین اونیه که Stack نصب کرده، باید از stack ghci
استفاده کنید.
اگه stack ghci
رو زدین* احتمالاً نوشتههای بیشتری اومدن، prompt ِتون† هم ممکنه Prelude
نباشه. موردی نداره. ممکنه نسخهی GHC تون هم فرق داشته باشه، که اگه بین ۷٫۸ و ۸٫۰ باشه، به احتمال قوی با این کتاب هم سازگاره.
الان هنوز stack ghci
رو لازم ندارین، ولی جلوتر که میریم، وقتی پروژه میسازیم و چندتا ماژول وارد میکنیم، استفاده از Stack خیلی معقولتره.
م. منظور از prompt، علامت، نشونه یا نوشتهایه که میگه کامپیوتر آمادهی گرفتن ورودیه.
خوب، حالا چندتا محاسبهی ساده رو تو prompt بنویسین:
Prelude> 2 + 2
4
Prelude> 7 < 9
True
Prelude> 10 ^ 2
100
اگه میتونین معادلات ساده مثلِ اینها رو تو prompt وارد کنید و نتایج صحیح بگیرین... مبارکه — حالا دیگه یه برنامهنویس تابعی شدین! دیگه اینکه REPL ِتون کار میکنه و میتونین ادامه بدین.
از GHCi با دستور :quit
یا :q
میشه خارج شد.
Prelude
چیه؟
در طول کتاب از دستورات GHCi تو REPL مثلِ :quit
و :info
استفاده میکنیم. اینها دستورات خاصیاند که فقط GHCi میشناسه و همهشون با کاراکترِ :
(دو نقطه) شروع میشن. :quit
کد هسکل نیست؛ فقط یکی از امکانات GHCi ِه.
ما این دستورات رو کامل مینویسیم، ولی عموماً میشه به حرف اولشون خلاصه بشن. مثلاً :quit
میشه :q
یا :info
میشه :i
و بقیه به همین ترتیب. چند بارِ اول خوبه که کامل تایپ کنین تا یادتون بمونه هر حرف مخفف چیه، ولی بعد از چند بار، دیگه خلاصه مینویسیم.
کدنویسی در فایل
بیشترِ وقتها لازم میشه کد رو تو یه فایل ذخیره کنین تا بتونین خورده خورده بسازینش. تقریباً هر برنامهی درستوحسابیای که مینویسین، باید براش کتابخونه های مختلف یا برنامههایی که پوشههای تودرتو با فایلهای هسکل دارن رو ویرایش کنین. فرایندِ اصلی اینجوریه که کد و واردات ِ لازم (واردات رو بعداً بیشتر توضیح میدیم) برای برنامه رو تو یه فایل بنویسین، بیارین تو REPL و اونجا باهاش کار کنین. اینطوری میتونین برنامهتون رو خوردهخورده تست و ویرایش کنین تا کامل شه.
یه فایل به اسم test.hs
بسازین. پسوند .hs
برای فایلهای هسکل به کار میره. میتونین اول فایل رو بسازین بعد توی یه برنامهی ویرایش متن بازش کنین و توش کد بنویسین، یا میتونین اول برنامهی ویرایشِ متن رو باز کنین و کد رو توی یه فایل جدید بنویسین، بعد هم به اون نام ذخیرهش کنید. هر طور که راحتین.
کد زیر رو توی اون فایل تایپ و بعد هم ذخیرهش کنید:
sayHello :: String -> IO ()
sayHello x =
putStrLn ("Hello, " ++ x ++ "!")
اینجا بعد از ::
(دو تا دو نقطه)، نشانِ نوع یا تایپ سیگنِچرِ تابع رو نوشتیم. میشه اینطوری خوندش: دارای تایپِ ... است که به جای سه نقطه، تایپ سیگنچرِ جلوش رو میخونیم. پس sayHello
دارای تایپِ String -> IO ()
است. تمرکزِ این فصلهای اول روی گرامر ِه، جلوتر تو یکی از فصلها، تایپها رو توضیح میدیم.
حالا تو همون پوشهای که test.hs
رو ذخیره کردین، ghci رو باز کنید و دستورات زیر رو وارد کنید:
Prelude> :load test.hs
Prelude> sayHello "Haskell"
Hello, Haskell!
Prelude>
بعد از اینکه با :load
فایل test.hs
رو بارگذاری کردین، تابعِ sayHello
در دسترسِ REPL قرار گرفت. بعد یه آرگومانِ string، مثل "Haskell"
رو بهش دادین (به اون علامتهای نقل قول دقت کنید)، و تونستین جوابش رو ببینید.
ممکنه متوجه شده باشین که بعد از بارگذاری ِ اون فایل، prompt ِتون دیگه Prelude>
نیست. اگه میخواین دوباره Prelude>
بشه، دستور :m
که خلاصهی :module
هست رو وارد کنین. این دستور فایلهاتون رو از GHCi برمیداره، و دیگه REPL به کدهای اون فایلها دسترسی نداره.