এটি IO
মোনাডের একটি প্রস্তাবিত "ব্যাখ্যা" । আপনি যদি এই "ব্যাখ্যা "টিকে গুরুত্ব সহকারে নিতে চান তবে আপনার" রিয়েল ওয়ার্ল্ড "কে গুরুত্ব সহকারে নেওয়া দরকার। এটি অনুমানযোগ্য কিনা তা action world
অনুমানযোগ্যভাবে মূল্যায়ন করা হয় বা না হয়, এর action
কোনও পার্শ্ব-প্রতিক্রিয়া নেই, এর প্রভাবগুলি যদি থাকে তবে মহাবিশ্বের নতুন অবস্থানে ফিরে আসে যেখানে এই প্রভাবগুলি দেখা গেছে, যেমন নেটওয়ার্ক প্যাকেট প্রেরণ করা হয়েছে। যাইহোক, ফাংশন ফলাফল ((),world)
এবং সেইজন্য মহাবিশ্বের নতুন রাষ্ট্র world
। আমরা নতুন মহাবিশ্ব ব্যবহার করি না যা আমরা অনুমানমূলকভাবে পাশাপাশি মূল্যায়ন করেছি। মহাবিশ্বের অবস্থা world
।
আপনি সম্ভবত এটি গুরুত্ব সহকারে নিতে একটি কঠিন সময় আছে। এটি বেশ কয়েকটি উপায়ে রয়েছে যা সর্বোপরি অতিষ্ঠভাবে প্যারাডক্সিকাল এবং অযৌক্তিক। সংমেয় বিশেষত হয় এই দৃষ্টিকোণ দিয়ে স্পষ্টতই না স্পষ্ট বা উন্মাদ।
"অপেক্ষা করুন, অপেক্ষা করুন," আপনি বলেছেন। " RealWorld
এটি কেবল একটি 'টোকেন' actually এটি আসলে পুরো মহাবিশ্বের অবস্থা নয় " " ঠিক আছে, তাহলে এই "ব্যাখ্যা" কিছুই ব্যাখ্যা করে না। তবুও, বাস্তবায়নের বিশদ হিসাবে , এইভাবে জিএইচসি মডেল IO
। 1 তবে এর অর্থ হ'ল আমাদের কাছে যাদুকরী "ফাংশন" রয়েছে যাগুলির আসলে পার্শ্ব প্রতিক্রিয়া হয় এবং এই মডেলটি তাদের অর্থের কোনও দিকনির্দেশনা সরবরাহ করে না। এবং, যেহেতু এই ফাংশনগুলির আসলে পার্শ্ব-প্রতিক্রিয়া রয়েছে, তাই আপনার উত্থাপিত উদ্বেগ সম্পূর্ণরূপে বিন্দু। GHC নেই তার পথ থেকে বেরিয়ে যান নিশ্চিত করতে হবে RealWorld
এবং এই বিশেষ ফাংশন উপায়গুলির প্রোগ্রামের উদ্দীষ্ট আচরণ পরিবর্তন মধ্যে অপ্টিমাইজ করা হয় না।
ব্যক্তিগতভাবে (সম্ভবত এখনই এটি স্পষ্টভাবে বোঝা যায়), আমি মনে করি এই "বিশ্ব-পাসিং" মডেলটি IO
কেবলমাত্র শিক্ষাগত সরঞ্জাম হিসাবে অকেজো এবং বিভ্রান্তিকর। (এটি বাস্তবায়নের জন্য কার্যকর কিনা, আমি জানি না G জিএইচসির পক্ষে, আমি মনে করি এটি aতিহাসিক নিদর্শনগুলির চেয়ে বেশি))
একটি বিকল্প পদ্ধতির IO
প্রতিক্রিয়া হ্যান্ডলারের সাথে বর্ণনামূলক অনুরোধ হিসাবে দেখা। এই কাজ করার বিভিন্ন উপায় আছে। সম্ভবত সর্বাধিক অ্যাক্সেসযোগ্য হ'ল একটি ফ্রি মনাদ নির্মাণ ব্যবহার করা, বিশেষত আমরা ব্যবহার করতে পারি:
data IO a = Return a | Request OSRequest (OSResponse -> IO a)
এটি আরও পরিশীলিত করার এবং কিছুটা আরও ভাল বৈশিষ্ট্যযুক্ত করার অনেকগুলি উপায় রয়েছে তবে এটি ইতিমধ্যে একটি উন্নতি। বাস্তবতার প্রকৃতি বোঝার জন্য এটিতে গভীর দার্শনিক অনুমানের প্রয়োজন নেই। কেবলমাত্র এটিই বলে যে IO
এটি একটি তুচ্ছ প্রোগ্রাম Return
যা কোনও মূল্য ফেরত দেওয়া ব্যতীত কিছুই করে না, বা এটি প্রতিক্রিয়াটির জন্য একটি হ্যান্ডলার সহ অপারেটিং সিস্টেমকে একটি অনুরোধ। OSRequest
এর মতো কিছু হতে পারে:
data OSRequest = OpenFile FilePath | PutStr String | ...
একইভাবে, OSResponse
কিছু হতে পারে:
data OSResponse = Errno Int | OpenSucceeded Handle | ...
(যে উন্নতি করা যেতে পারে তার মধ্যে একটি বিষয়টিকে আরও ধরণের সুরক্ষিত করা যাতে আপনি জানেন যে OpenSucceeded
কোনও PutStr
অনুরোধ থেকে আপনি পাবেন না )) এই মডেলগুলি IO
অনুরোধগুলি বর্ণনা করে যা কিছু সিস্টেম দ্বারা ব্যাখ্যা করা হয় ("সত্যিকারের" IO
মনডের জন্য এটি হ্যাশেল রানটাইম নিজেই), এবং তারপরে, সম্ভবত, সেই সিস্টেমটি হ্যান্ডলারটিকে কল করবে যা আমরা একটি প্রতিক্রিয়া দিয়েছি। এটি অবশ্যই কোনও অনুরোধটি কীভাবে PutStr "hello world"
পরিচালনা করা উচিত তার কোনও ইঙ্গিত দেয় না , তবে এটি ভানও করে না। এটি স্পষ্ট করে তোলে যে এটি অন্য কোনও সিস্টেমে প্রেরণ করা হচ্ছে। এই মডেলটিও বেশ নির্ভুল। আধুনিক ওএসে থাকা সমস্ত ব্যবহারকারী প্রোগ্রামগুলিকে ওএসকে কিছু করার জন্য অনুরোধ করতে হবে।
এই মডেলটি সঠিক অন্তর্দৃষ্টি সরবরাহ করে। উদাহরণস্বরূপ, অনেক <-
নবজাতক অপারেটরের মতো জিনিসগুলিকে "আনারপ্যাটিং" হিসাবে দেখেন IO
, বা (দুর্ভাগ্যক্রমে আরও জোরযুক্ত) মতামত দিয়েছেন যে, একটি IO String
বলে, এটি একটি "ধারক" যা "থাকে" String
এবং তারপরে <-
সেগুলি বেরিয়ে যায়)। এই অনুরোধ-প্রতিক্রিয়া দর্শন এই দৃষ্টিকোণটি পরিষ্কারভাবে ভুল করে তোলে। এর ভিতরে কোনও ফাইল হ্যান্ডেল নেই OpenFile "foo" (\r -> ...)
। এটির উপর জোর দেওয়ার একটি সাধারণ উপমাটি হ'ল কেকের জন্য একটি রেসিপিটির ভিতরে কোনও কেক নেই (বা সম্ভবত "চালান" এই ক্ষেত্রে আরও ভাল হবে)।
এই মডেলটি সম্মতিতে সহজেই কাজ করে। আমরা সহজেই OSRequest
পছন্দ মতো কোনও কনস্ট্রাক্টর রাখতে পারি Fork :: (OSResponse -> IO ()) -> OSRequest
এবং তারপরে রানটাইম এই অতিরিক্ত হ্যান্ডলারের দ্বারা উত্পাদিত অনুরোধগুলি সাধারণ হ্যান্ডলারের সাথে তবে এটি পছন্দ করতে পারে। কিছু চতুরতার সাথে আপনি এই (বা সম্পর্কিত কৌশলগুলি) প্রকৃতপক্ষে সামঞ্জস্যের মতো জিনিসগুলি আরও সরাসরি সরাসরি বলার পরিবর্তে মডেল করতে ব্যবহার করতে পারেন "আমরা ওএসের কাছে একটি অনুরোধ করি এবং জিনিসগুলি ঘটে যায়।" IOSpec
লাইব্রেরিটি এভাবেই কাজ করে।
1 আলিঙ্গনগুলি একটি ধারাবাহিকতা ভিত্তিক বাস্তবায়ন ব্যবহার করেছিল IO
যা আমি একটি স্পষ্ট ডেটা প্রকারের পরিবর্তে অস্বচ্ছ ফাংশনগুলির সাথে বর্ণনা করি ঠিক একইরকম। পুরাতন অনুরোধ-প্রতিক্রিয়া স্ট্রিম-ভিত্তিক আইও-এর উপরে এইচবিসি একটি ধারাবাহিকতা-ভিত্তিক বাস্তবায়ন ব্যবহার করেছে। এনএইচসি (এবং এভাবে ওয়াইএইচসি) থুঙ্কগুলি ব্যবহার করেছিল, অর্থাত্ IO a = () -> a
যদিও এটি ()
বলা হয়েছিল World
, কিন্তু এটি রাষ্ট্র-পাসিং করছে না। জেএইচসি এবং ইউএইচসি মূলত জিএইচসি হিসাবে একই পদ্ধতির ব্যবহার করেছিল।