۲ - ۲تعامل با کد هسکل

هسکل دو راهِ اصلی برای کار با کد در اختیار میذاره. اولی نوشتنِ کد مستقیماً تو محیط تعاملی ِ هسکل به اسم 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 به کدهای اون فایل‌ها دسترسی نداره.