হাস্কেলের কাছে নতুন লোকেরা যে সবচেয়ে নতুন উদ্ভাবন লক্ষ্য করেছে তা হ'ল বাইরের জগতের সাথে যোগাযোগের সাথে জড়িত অপরিষ্কার জগত এবং গণনা এবং অ্যালগরিদমের বিশুদ্ধ জগতের মধ্যে একটি বিচ্ছেদ রয়েছে। একটি ঘন ঘন শিক্ষানবিস প্রশ্নটি হয় "আমি কীভাবে পরিত্রাণ পেতে পারি IO
, অর্থাৎ রূপান্তর IO a
করতে a
পারি?" এর উপায় হ'ল আইও এবং চেইন প্রভাবগুলি সম্পাদন করে এমন কোড লিখতে মনড (বা অন্যান্য বিমূর্তি) ব্যবহার করা। এই কোডটি বাইরের বিশ্ব থেকে ডেটা সংগ্রহ করে, এর একটি মডেল তৈরি করে, সম্ভবত খাঁটি কোড নিযুক্ত করে কিছু গণনা করে এবং ফলাফলকে আউটপুট করে।
উপরের মডেলটির হিসাবে, আমি মোনাডে জিইউআইগুলি পরিচালনা করার সাথে ভয়ঙ্কর কিছু দেখতে পাচ্ছি না IO
। এই স্টাইল থেকে সবচেয়ে বড় সমস্যাটি দেখা দেয় যে মডিউলগুলি এখন আর কমপোজযোগ্য নয়, অর্থাত্ আমি আমার প্রোগ্রামের বিবৃতিগুলির বিশ্বব্যাপী মৃত্যুদণ্ডের আদেশ সম্পর্কে আমার বেশিরভাগ জ্ঞান হারিয়ে ফেলছি। এটি পুনরুদ্ধার করতে, আমাকে একই সাথে যুক্তি প্রয়োগ করতে হবে সমবর্তী, অত্যাবশ্যক জিইউআই কোডের মতো। এদিকে, অপরিষ্কারের জন্য, নন-জিইউআই কোড কার্যকর করার আদেশটি স্পষ্ট কারণ IO
মনোদের >==
অপারেটরের সংজ্ঞা (কমপক্ষে যতক্ষণ না কেবল একটি থ্রেড থাকে ততক্ষণ)। খাঁটি কোডের জন্য, কর্মক্ষমতা বাড়াতে বা ফলস্বরূপ মূল্যায়ন এড়াতে কোণার ক্ষেত্রে বাদে মোটেও কিছু যায় আসে না ⊥
।
কনসোল এবং গ্রাফিকাল আইওয়ের মধ্যে সবচেয়ে বড় দার্শনিক পার্থক্যটি হ'ল পূর্বের প্রয়োগকারী প্রোগ্রামগুলি সাধারণত সিঙ্ক্রোনাস স্টাইলে লেখা হয়। এটি সম্ভব কারণ সেখানে (সংকেতগুলি এবং অন্যান্য ওপেন ফাইল বর্ণনাকারী বাদ দেওয়া) ইভেন্টগুলির কেবলমাত্র একটি উত্স: বাইট স্ট্রিমটি সাধারণত বলা হয় stdin
। জিইউআইগুলি যদিও অন্তর্নিহিত অবিচ্ছিন্ন তবে কীবোর্ড ইভেন্ট এবং মাউস ক্লিকগুলিতে প্রতিক্রিয়া জানাতে হবে।
কার্যকরী উপায়ে অ্যাসিঙ্ক্রোনাস আইও করার একটি জনপ্রিয় দর্শনকে ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং (এফআরপি) বলা হয়। এটি সম্প্রতি রিঅ্যাকটিভএক্সের মতো লাইব্রেরি এবং এলমের মতো ফ্রেমওয়ার্কগুলিকে ধন্যবাদ, অশুচি, অ-কার্যকরী ভাষাতে প্রচুর পরিমাণে চিহ্নিত করে । সংক্ষেপে, এটি জিইউআই উপাদানগুলি দেখার মতো এবং অন্যান্য বিষয়গুলি (যেমন ফাইল, ক্লক, অ্যালার্ম, কীবোর্ড, মাউস) ইভেন্ট উত্স হিসাবে দেখা হয়, "অবজারভেবল" নামে পরিচিত, যা ইভেন্টগুলির প্রবাহকে নির্গত করে। এই ইভেন্টগুলি পরিচিত অপারেটর ব্যবহার করে যেমন একত্রিত করা হয় map
, foldl
, zip
, filter
, concat
, join
, ইত্যাদি, নতুন স্ট্রিম উত্পাদন করতে। এটি কার্যকর কারণ প্রোগ্রামটি রাষ্ট্র হিসাবে নিজেই প্রোগ্রাম হিসাবে দেখা যায় scanl . map reactToEvents $ zipN <eventStreams>
, যেখানে প্রোগ্রামটি N
কখনও বিবেচনা করা যায় এমন পর্যবেক্ষণের সংখ্যার সমান।
এফআরপি পর্যবেক্ষণযোগ্যদের সাথে কাজ করা মিশ্রণযোগ্যতা পুনরুদ্ধার করা সম্ভব করে তোলে কারণ একটি স্ট্রিমের ইভেন্টগুলি সময়মতো অর্ডার করা হয়। কারণ হ'ল ইভেন্ট স্ট্রিম বিমূর্ততা সমস্ত পর্যবেক্ষণযোগ্যকে কালো বাক্স হিসাবে দেখা সম্ভব করে। শেষ পর্যন্ত, অপারেটরগুলি ব্যবহার করে ইভেন্ট স্ট্রিমগুলির সংমিশ্রণ কার্যকর করার বিষয়ে কিছু স্থানীয় ক্রম ফিরিয়ে দেয়। আমার প্রোগ্রামটি আসলে কোন আক্রমণকারীদের উপর নির্ভর করে এটি সম্পর্কে আমাকে আরও বেশি সৎ হতে বাধ্য করে, যেমন হাস্কেলের সমস্ত ক্রিয়াকলাপগুলি সাধারণভাবে স্বচ্ছ হতে হবে: আমি যদি আমার প্রোগ্রামের অন্য একটি অংশ থেকে ডেটা টানতে চাই তবে আমাকে স্পষ্ট হতে হবে বিজ্ঞাপনটি আমার ফাংশনগুলির জন্য উপযুক্ত প্রকারের ঘোষণা করে declare (আইও মোনাড, অশুচি কোড লেখার জন্য একটি ডোমেন-নির্দিষ্ট ভাষা হওয়ায় কার্যকরভাবে এটিকে নিষ্ক্রিয় করে তোলে)