برای این که در لینوکس ازش استفاده کنیم باید ghc رو نصب کنیم.
sudo apt-get install ghc
و خب نزدیک ۵۰ مگ دان میکنه و بعد نصب هم نزدیک ۲۰۰ مگ جا روی هارد میگیره. خب برای شروع چی نیاز داریم؟ یک ادیتور متنی و یک ترمینال. خب ادیتور چی پیشنهاد میشه؟ حتی leafpad که در xfce موجوده هم کافیه براش ! . برای شروع به کار با این زبان ، کافیه که ghci رو اجرا کنیم تا بتونیم به عنوان یک ماشین حساب ازش استفاده کنیم:
ghci
و بعدش وارد شل خودش میشه. اینجا میتونید اینها رو تایپ کنید و نتیجه رو ببینید : (البته فکر کنم زوایا رو بر حسب گراد حساب میکنه) :
2+2
sin(45)
cos(30)
tan(60)
2*2^5
5^6
pi
و ببنید که چی به چیه. خب در اینجا هم دو مفهوم «عملگر» و «عملوند» رو داریم باز عملگرها هم مثل سایر زبانهای برنامه نویسی هستند.
اولین و ساده ترین برنامه :
میخوایم یک برنامه بسازیم ، اونم برای چه کاری؟ محاسبه مساحت یک دایره خب ابتدا باید یک ادیتور باز کنیم و بعدش :
متغیر تعریف میکنیم (r که معروفه )
r = 2
و بعد باید یک تابع تعریف کنیم :
area = pi*r^2
یعنی سورس ما چنین شکلی خواهد داشت :
r = 2
area = pi*r^2
خب این رو به نام circle.hs در Desktop ذخیره میکنیم و ghci رو اجرا میکنیم ! بعدش چه کنیم؟ این کدها رو وارد میکنیم :
:cd ~/Desktop
:load circle.hs
بعدش چنانچه در شل جدید که prompt اون Main هست، تایپ کنیم area مساحت رو نشونمون میده.
دریافت ورودی از کاربر و قرار دادن توی تابع :
بعضی وقتها پیش میاد که نیاز باشه کاربر یک ورودی به یک تابع بده و ازش خروجی تهیه کنه ، با روش قبلی تنها به این شکل بود که مثلا برای r مقدار ۵ یا هر چیز دیگری (از منفی بی نهایت تا مثبت بی نهایت) رو تعریف میکردیم و برنامه تنها یک خروجی داشت! اما حالا برنامه ای خواهیم نوشت که مقدار رو موقع load شدن از کاربر دریافت کنه !
کل کد ما به این شکل خلاصه میشه :
area r = pi*r^2
این کد رو در فایل circle.hs ذخیره میکنیم.
خب به شیوه قبلی با دستورات :cd و :load برنامه رو کامپایل میکنیم. حالا این ها رو تست کنید :
area 2
area 0.3
area 12
و ببنید چی دریافت میکنید ! البته تابع خالی رو دیگه نمیتونید بهش بدید !
حالا یک تمرین خودتون حل کنید :
یک برنامه برای محاسبه مساحت مثلث بنویسید!
نکته مهم : کدهایی که در پایین میان تفاوتهایی با هم دارند و لازم دونستم حتما بگم!
خب یک دایره داریم ، با شعاع ۸ ، حالا میخوایم به ۵+۳ بشکنیمش! در هاسکل کدش اینطور هست :
area (5+3)
و میخوایم به مساحت دایره با شعاع ۵ ، ۳ واحد ناقابل اضافه کنیم :
area 5+3
و میخوایم مساحت دو دایره مماس ، یکی با شعاع ۳ و دیگری ۵ رو با هم جمع کنیم (فرض کنید این دو دایره به هم چسبیدن! مثل مسائل مساحت راهنمایی ).
area 3 + area 5
که البته چون عمل جمع هست ترتیب مهم نیست.
کد اول دارای پرانتز هست و این یعنی حتما برای اینکه ابتدا دو عدد جمع بشه و بعد سایر عملیات ها روش اعمال بشه نیاز به پرانتز داریم ، پرانتز در ریاضی بالاترین اولویت رو داره ، بعدش توان و رادیکال ، بعدش ضرب و تقسیم ، بعدش جمع و تفریق. اگر به دو اولویت مشابه ، مثلا ضرب و تقسیم پشت هم رسیدیم ، از سمت چپ اونی که جلوتر هست رو ابتدا انجام میدیم. کامپیوتر هم همین کار رو میکنه.
کد دوم ابتدا مساحت رو حساب میکنه ، بعدش مقدار بعد علامت + رو به مساحت اضافه میکنه، چرا؟ چون فرمول مساحت دارای توان و ضرب هست که طبعا اولویت های بالاتری دارند
کد سوم هم که دو مساحت رو جداگانه حساب میکنه و در نهایت ، اونها رو با هم جمع کرده و به ما نشون میده. برای تفریق و ضرب و تقسیم و ... هم به همین شکل عمل کنید.
خب یک خبر بد! هاسکل کتانژانت حساب نمیکند! اما برای محاسبه کتانژانت کافیست که یک تابع کتانژانت براش تعریف کنیم. برای محاسبه کتانژانت دو راه هست :
۱- تقسیم عدد یک بر تانژانت
۲- تقسیم کسینوس بر سینوس
چون هاسکل ، امکان محاسبه تانژانت رو داره ، میتونیم همون فایل circle.hs رو ویرایش کنیم و یک تابع جدید براش بنویسیم :
cot(r) = 1/tan(r)
و بعد اون کد رو اجرا کنیم ! (روش اجرا در بالا توضیح داده شد!) .
خب این بار میخوایم بریم سراغ کامپایل برنامه از سورس .
برای نوشتن سورس اول مثال همیشگی Hello World رو مینویسیم (در یک فایل به نام HelloWrold.hs) .
main = putStr("Hello World!\n")
توضیح:
main ماژول اصلی هست که کامپایلر ازش استفاده میکنه. putStr هم که مشخصه! برای نمایش داده از نوع String به کار میره. دستورات backslash هم اینجا هستند (همه جا هستند ) .
خب فایل رو Save میکنیم و بعد بدین شکل کامپایل مینماییم :
haskell-compiler HelloWorld.hs
یک نمونه پیشرفته تر از همین کد که اسمتون رو میگیره و بهتون سلام میکنه :
main = putStrLn "Waht's your name?">>
getLine>>= \ name ->
putStr("Hello, " ++ name ++ "!\n")
این رو هم کامپایل کنید تا به قدرت هسکل در این زمینه هم پی ببرید.
عملگرهای منظقی :
خب یکم چاشنی منطق به کارمون اضافه نکنیم عایا؟ .
اینجا هم عملگرهای منطقی مثل && و || وجود دارند. عملگرهای منطقی، تفاوتی با عملکردها حسابی دارند. تفاوتهای عمده این دو عملگر در این هست که عملگر حسابی، یک مقدار با مقدار دیگر محاسبه میکنه (۴ عمل اصلی) و عملگر منطقی ، اونها رو با هم مقایسه میکنه.
قبل از توضیح بیشتر، بیایم یکم عملگر بازی کنیم . این عملگر بازی سادست. تنها کافیه که ghci را باز نموده و خروجی این دستورات رو بررسی کنیم :
True && True
و یا
True && False
و یا
True || False
خب عملگرهای منطقی، عدد این چیزا حالیشون نیست و فقط True و False (یا بهتره بگیم صفر و یک ) میفهمند.
عملگر && به معنای AND و عملگر || به معنای OR هست.