برای شروع به چه چیزی نیاز داریم؟
اما به هاسکل برای پردازش روی اعداد ساخته شده است، پس اینجا به مثال HelloWorld هیچ نیازی نیست. هرحال یک زبان برنامه نویسی بوده و به یک ادیتور و یک محیط کامپایلر نیاز دارد. همچنین این زبان دارای Shell مخصوص به خود نیز هست . (درست همانند پایتون) . برای ادیتور، نیاز نیست حتما ادیتوری پیشرفته نصب کنید (یا بخرید). با ساده ترین ادیتور نیز میتوانید کارتان را راه بیندازند.جهت اطلاع از سایر کامپایلرها میتوانید به وبگاه رسمی هاسکل مراجعه کنید.
هاسکل چه ویژگی هایی دارد؟
هاسکل کمی تنبل است ، درست شنیدید! تنبل! میپرسید چرا؟ برای این که این زبان یک تابع که شما نوشتهاید را ، تنها زمانی اجرا میکند که فراخوانی شود. در زمان دیگری آن تابع اجرا نمیشود.
٣ چه زبانهای دیگری عملکردی مشابه هاسکل دارند؟
زبانهای زیادی هستند ، مشهور ترین آنها در دنیای لینوکس R است. همچنین در دنیای کاربران سایر سیستم ، MATLAB نیز از محبوبیت بالایی برخوردار است. شما مختارید که بین این زبانها ، یک یا چند تا را انتخاب کرده و یاد بگیرید اما پیشنهاد من به شما هاسکل است ، زیرا هم ساده است و هم دید ریاضیاتی شما را بالا میبرد!
٤ شروع آموزش
در ابتدا با چنین صحنه ای روبرو خواهید شد:
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>
عبارت Prelude در واقع Prompt شل ghciاست. ابتدا چند مساله ساده را بیایید کمی امتحان کنیم .
Prelude> 2+2نتیجه را دیدید . بله ، دقیقا همان کارهایی که با ماشین حساب مهندسی انجام میدهیم در این زبان هم امکان پذیر است. اما توجه کنید که اینجا پردازنده کوچک ماشین حساب طرف حساب ما نیست ، حتی اگر از ضیف ترین سیستم مدرن هم استفاده کنید حداقل یک پردازنده ٢ گیگاهرتز ٢ هسته ای دارید که از ماشین حسابهای مهندسی معمولی بسیار قوی تر است. اما آیا باید به همین ها بسنده کنیم؟ نه الزامی ندارد. در ادامه شما را آشنا میکنیم. شاید شما هم روزانه در ترمینال لینوکس یا مکینتاش یا هر سیستم عامل دیگری مشغول کار میشوید. تبریک! بسیاری از دستورات اینجا نیز شبیه ترمینال یونیکس است. برای تغییر به یک دایرکتوری خاص (مثلا میزکار) باید این دستور را وارد کنید :
4
Prelude> 2+3
5
Prelude> sin(45)
0.8509035245341184
:cd ~/Desktopهمچنین برای خروج از کامپایلر کد زیر را وارد نمایید :
:quit
تعریف متغیر
این محیط هم متغیرهایی در خود دارد. مثلا یکی از معروف ترینها همان عدد نام آشنای « پی » است. جهت دیدن مقدار این عدد در شل pi وارد کنید و نتیجه را ببینیدPrelude> piخب آیا خودمان هم میتوانیم متغیر معرفی کنیم؟ جواب شما بله است. اصل برنامه نویسی و محاسبات در رایانه ، این است که همه چیز را خودمان تعیین کنیم و فقط هنگام اجرای برنامه ها ، مقادیر دلخواه را بعنوان مقدار r مقدار متغیر ها به آن بدهیم. متغیرها در هاسکل بسیار ساده تعریف میشوند، برای مثال میخواهیم برای ٣ را تعیین کنیم. پس به این روش عمل میکنیم :
3.141592653589793
Prelude> let r = 3
Prelude> r
3
توضیح آنکه در خط اول به ازای ghci مقدار ٣ را تعریف نموده و در خط دوم ، آنرا فراخوانده ایم و سپس با نوشتن r نیز به ما نتیجه را نشان داده است. این یک مقدمه است. مقدمه ای برای اینکه در یک فایل دیگر، توابعی را بنویسیم و سپس آن را کامپایل کنیم. به نظرتان چیزی کم نیست؟ درست است تا اینجا در مورد توابع صحبت نکرده ایم. در بخش بعدی به خوبی تکلیف توابع را روشن خواهیم کرد.
توابع در Haskell
همانگونه که میدانید هاسکل یک زبان تابعی است و مطمئنا همین توابع هستند که رنگ و بوی دیگری به هاسکل میدهند. برای اینکه ببینیم توابع در هاسکل چه تعریفی دارند باید تعریف ریاضی تابع را بدانیم. به عبارت دقیقتر هر کجا و در هر زبانی سخن از تابع به میان می آید ، همان تعریف توابع ریاضی را باید دانست.حال ببینیم تعریف ریاضی تابع چیست؟ ریاضی میگوید «تابع قانونی است از A به B که در آن ، به هر عضو A دقیقا یک عضو از B نظیر میشود»
میتواند A هرچیزی میتوانند باشند ، مثلا مجموعه B و A مجموعه های افراد یک جامعه می توانند یک مجموعه گروه خونی آنان باشد. در هاسکل میتوانند به عنوان مقدار یک متغیر تعریف شوند. و از همه مهم تر ، هاسکل هم فقط از شما عدد را قبول میکند نه یک سری حروف به عنوان گروه خونی. این همه مقدمه چینی کردیم، حال یک تابع مینویسیم.
ما در اینجا یک تابع داریم که به ازای هر ورودی، مساحت دایره ای با شعاع ورودی را میدهد. پس مجموعه A مجموعه تعدادی شعاع و مجموعه B مجموعه مساحتهاست. خب کد و نتیجه کار ما این خواهد شد :
Prelude> let area r = pi*(r^2)توضیح این کد که واضح است. در خط اول یک تابع نوشتیم. در تابع گفته شد که هر مقداری به ازای r داده ایم r ضرب کن. در خط دوم هم که یک مقدار به ازای pi دریافت نمودی ، آن را به توان ٢ برسان و در
Prelude> area 5
78.53981633974483
، این عملیات روی آن انجام شد و سپس خروجی عددی گرفتیم. نکته دیگر آنکه دقت هاسکل بسیار بالاست.
خب چطور است به همراه هم یک تابع دیگر نیز بنویسیم؟ حال که تا اینجا را خوانده اید ادامه اش را نیز با ما بخوانید. مطمئنا خواندن یک تابع در زبان برنامه نویسی از خواندن درسهایتان جذاب تر است (نگارنده در حال خنده!). یک حقیقت نه چندان تلخ این است که هاسکل نمیتواند کتانژانت حساب کند. خب اینجا به یک حقیقت میرسیم « وقتی یک واحد زنده به محیط بیرون دسترسی ندارد، محیط بیرون به سمت آن می آید » .
تابع کتانژانت بسیار ساده است. هاسکل هم سینوس و کسینوس را محاسبه میکند و هم تانژانت را. بخاطر رابطه ساده ای که بین تانژانت و کتانژانت وجود دارد ، تابع را با استفاده از تانژانت مینویسیم :
Prelude> let cot(r) = 1/tan(r)در خط اول به هاسکل فهماندیم که کتانژانت ، تقسیم عدد یک بر تانژانت است (گرچه میتوان از طریق سینوس و کسینوس هم این محاسبات را انجام داد). البته میتوانید امتحان هم بکنید ، امتحان ضرری ندارد. و سپس تانژانت و کتانژانت آن را در هم ضرب کنید (در r) یک متغیر را در نظر بگیرید (مثلا در اینجا همان صورتی تابع ما صحیح است که جواب ١ باشد)
Prelude> cot(45)
0.6173696237835551
Prelude> tan(30)*cot(30)بله خوشبختانه کد ما درست بوده و حاصلضرب کتانژانت در تانژانت برابر با یک شده است. در بخش بعد در مورد نوشتن کد و سپس کامپایل آن صحبت خواهیم کرد.
1.0
نوشتن و کامپایل برنامه هاسکل
همانگونه که کد C را هم میتوانیم. برای نوشتن کد هاسکل (همانگونه که ابتدای مقاله ذکر شد) نیازی نیست تا حتما ادیتور بسیاراستفاده ( Xfce ادیتور پیشفرضمیزکار ) Leafpad پیشرفته ای داشته باشیم. بهرحال نگارنده ترجیح میدهد از
کند. چون در هاسکل کدها نیازی به رنگی شدن و خطایابی ندارند.
نکته : در کدهایی که مینویسیم نیازی به let برای تعریف تابع و متغیر نداریم.استفاده کنیم. میخواهیم کد ساده ای را با هم نوشته و let خب همانطور که خواندید ، نیازی نیست که از
کامپایل کنیم. ابتدا یک داکیومنت خالی روی دسکتاپ ایجاد کرده ، آن را با ادیتور دلخواه باز میکنیم و سپس
کدهای زیر را داخلش مینویسیم :
f(x) = x^2دارند hs آنرا ذخیر میکنیم. توجه کنید که سورسهای هاسکل همه پسوند function.hs و با نام
شده و تایپ میکنیم : ghci سپس وارد ترمینال و سپس
Prelude> :cd ~/Desktop/میبرد و کد دوم برنامه را کامپایل میکند. پساز زدن دستور دوم چنین Desktop کد اول شما را به فولدر
Prelude> :load function.hs
صحنه ای پیش چشمان شما رخ میدهد :
[1 of 1] Compiling Main ( function.hs, interpreted )در حقیقت ماژولی است که برنامه از آن به جهت Main . تغییر میکند Main به Prelude از prompt و
Ok, modules loaded: Main.
*Main>
مقدار بگذارید و نتیجه را ببینید : x کامپایل شدن استفاده کرده است. چرا بیکارید؟ کمی به جای
*Main> f(2)درست دیدید! برنامه با موفقیت کامپایل شد و نتیجه داد! این خود نشان میدهد که کد ما مشکلی نداشته
4
*Main> f(3)
9
است. خب ، آیا اکنون کار دیگری با هاسکل داریم؟ شاید الان دیگر کاری نداشته باشیم. پس به سادگی تایپ
میکنیم :
*Main> :quit
خب تا اینجا حسابی با هاسکل سر و کله زده اید و حتما لذت تایپ دستورات هاسکل را درک کرده اید.
نویسنده: محمدرضا حقیری - بهار ٩٢