অপরিষ্কার ভাষাগুলি আরও পরিচিত অপরিহার্য ভাষাগুলি থেকে মূলত নীতিগতভাবে পৃথক হয় না, বিশেষত এখন অনেকগুলি কার্যকরী কৌশল অনুলিপি করা হয়েছে। কী আলাদা তা হ'ল স্টাইল - আপনি কীভাবে সমস্যার সমাধান করবেন।
আপনি হাস্কেলকে খাঁটি হিসাবে গণ্য করেছেন বা আইও মনাদকে অপরিষ্কার হিসাবে গণনা করুন, হাস্কেল শৈলী এই স্টাইলের চূড়ান্ত রূপ এবং শেখার পক্ষে উপযুক্ত।
হাস্কেল আইও মোনাড (অবশ্যই) মনাদগুলির গাণিতিক তত্ত্ব থেকে প্রাপ্ত। তবে, জরুরী প্রোগ্রামারদের জন্য, আমি মনে করি মনদেসে পৌঁছানোর পিছনের দিকটি আরও অর্থবোধ করে।
প্রথম ধাপ - একটি খাঁটি কার্যকরী ভাষা সহজেই তার ফলাফল হিসাবে একটি বড় স্ট্রিং মান ফিরে আসতে পারে। এই বড় স্ট্রিংটি একটি আবশ্যক প্রোগ্রামের উত্স কোড হতে পারে যা কিছু প্রয়োজনীয়তা-নির্দিষ্টকরণের পরামিতিগুলি থেকে খাঁটি কার্যকরী উপায়ে নেওয়া হয়। তারপরে আপনি একটি "উচ্চ স্তরের" সংকলক তৈরি করতে পারেন যা আপনার কোড জেনারেটরটি চালায়, তারপরে স্বয়ংক্রিয়ভাবে সেই কোডটি উত্পন্ন ভাষা সংকলকটিতে ফিড করে।
দ্বিতীয় পর্যায়ে - পাঠ্য উত্স কোড তৈরি করার পরিবর্তে আপনি একটি দৃ strongly়-টাইপযুক্ত বিমূর্ত সিনট্যাক্স ট্রি তৈরি করেন। আপনার অপরিহার্য-ভাষা সংকলকটি আপনার "উচ্চ স্তরের" সংকলকটিতে শোষিত হয়েছে এবং সোভেল কোড হিসাবে সরাসরি এএসটি গ্রহণ করে। এটি হাস্কেল যা করে তার অনেক কাছাকাছি।
যদিও এটি এখনও বিশ্রী। উদাহরণস্বরূপ আপনার দুটি স্বতন্ত্র ধরণের ফাংশন রয়েছে those কোড উত্পন্নকরণের পর্যায়ে যাঁরা মূল্যায়ন করেন এবং উত্পন্ন প্রোগ্রামটি চালিত হলে কার্যকর হয়। এটি কিছুটা C ++ এ ফাংশন এবং টেম্পলেটগুলির মধ্যে পার্থক্যের মতো।
সুতরাং, তৃতীয় ধাপের জন্য, উভয়কে একই করুন - একই কোড বাক্সের সাথে একই ক্রিয়াকলাপটি "কোড উত্পন্নকরণের" সময় আংশিকভাবে মূল্যায়ন করা যেতে পারে, বা সম্পূর্ণ মূল্যায়ন করা যায়, বা মোটেও মূল্যায়ন করা যায় না। তদুপরি, পুনরাবৃত্তির পক্ষে সমস্ত লুপিং এএসটি নোডগুলি বাতিল করুন। প্রকৃতপক্ষে, এএসটি নোডগুলির ধারণাটিকে এক বিশেষ ধরণের ডেটা হিসাবে পুরোপুরি বাতিল করুন - "আক্ষরিক মান" এএসটি নোড নেই, কেবল মান রয়েছে ইত্যাদি
এটি আইও মোনাড যা কিছু করে তা হ'ল - বাইন্ড অপারেটর প্রোগ্রামগুলি গঠনের জন্য "ক্রিয়াগুলি" রচনা করার একটি উপায়। এটি বিশেষ কিছু নয় - কেবল একটি ফাংশন। "কোড জেনারেশন" চলাকালীন অনেকগুলি এক্সপ্রেশন এবং ফাংশন মূল্যায়ন করা যায়, তবে I / O পার্শ্ব-প্রতিক্রিয়াগুলির উপর নির্ভরশীলদের অবশ্যই রান-সময় পর্যন্ত মূল্যায়ন বিলম্বিত করতে হবে - কোনও বিশেষ নিয়ম দ্বারা নয়, তবে ডেটা নির্ভরতার প্রাকৃতিক ফলাফল হিসাবে এক্সপ্রেশন।
স্নাতকগুলি সাধারণভাবে কেবল সাধারণীকরণ হয় - তাদের একই ইন্টারফেস রয়েছে, তবে বিমূর্ত ক্রিয়াকলাপগুলি ভিন্নভাবে প্রয়োগ করে, অতএব তারা আবশ্যক কোডের বিবরণটির মূল্যায়ন না করে পরিবর্তে অন্য কিছুতে মূল্যায়ন করে। একই ইন্টারফেস থাকার অর্থ কোনটি মনোডকে দেখাশুনা না করে আপনি মনডকে করতে পারেন এমন কিছু জিনিস যা কার্যকর হতে পারে।
নিঃসন্দেহে এই বর্ণনাটি বিশোধবাদীদের মাথা বিস্ফোরণে পরিণত করবে, তবে আমার কাছে এটি হাস্কেলকে আকর্ষণীয় করার কয়েকটি বাস্তব কারণ ব্যাখ্যা করে explains এটি প্রোগ্রামিং এবং রূপকগুলির মধ্যে সীমানাটি ঝাপসা করে এবং বিশেষ সিনট্যাক্সের প্রয়োজন ছাড়াই অপরিহার্য প্রোগ্রামিংয়ের পুনর্বিন্যাসের জন্য ক্রিয়ামূলক প্রোগ্রামিংয়ের সরঞ্জামগুলি ব্যবহার করে।
আমার সি ++ টেম্পলেটগুলির একটি সমালোচনা হ'ল এটি একটি বাধ্যতামূলক ভাষায় এক ধরণের ভাঙা বিশুদ্ধ কার্যকরী সাবালংগ্র্যাজ - রান-টাইমের পরিবর্তে একই বেসিক ফাংশনটি রান-টাইমের পরিবর্তে মূল্যায়নের জন্য আপনাকে একে একে সম্পূর্ণ ভিন্ন স্টাইল ব্যবহার করে পুনরায় বাস্তবায়ন করতে হবে কোডিং এর। হাস্কেলের ক্ষেত্রে অপরিচ্ছন্নতাটিকে যেমন ধরণের লেবেলযুক্ত করা উচিত, ঠিক একই ফাংশনটি মেটা-প্রোগ্রামিং অর্থে এবং একই প্রোগ্রামে রান-টাইম নন-মেটা-প্রোগ্রামিং উভয় ক্ষেত্রেই মূল্যায়ন করা যেতে পারে - কোনও হার্ড লাইন নেই প্রোগ্রামিং এবং metaprogramming মধ্যে।
এটি বলেছিল, কিছু রূপকগুলি রয়েছে যেগুলি স্ট্যান্ডার্ড হাস্কেল করতে পারে না, মূলত কারণ প্রকারগুলি (এবং সম্ভবত কয়েকটি অন্যান্য জিনিস) প্রথম শ্রেণির মান নয়। যদিও ভাষার ভেরিয়েন্টগুলি এটিকে সম্বোধন করার চেষ্টা করে।
হাস্কেল সম্পর্কে আমি অনেক কিছু বলেছি তা নাপাক কার্যকরী ভাষায় প্রয়োগ করা যেতে পারে - এবং এমনকি কখনও কখনও অপরিহার্য ভাষায়ও। হাস্কেল আলাদা কারণ আপনার কাছে এই পদ্ধতিকে গ্রহণ করা ছাড়া কোনও উপায় নেই - এটি মূলত আপনাকে এই স্টাইলের কাজ শিখতে বাধ্য করে। আপনি "এমএল তে সি লিখতে" পারেন, তবে আপনি "হাসকেলে সি লিখতে পারবেন না" - হুডের নীচে কী চলছে তা না শিখলে কমপক্ষে না।