আইও মোনাড কি প্রযুক্তিগতভাবে ভুল?


12

হাস্কেল উইকিতে আইও মোনাডের শর্তসাপেক্ষ ব্যবহারের নিম্নলিখিত উদাহরণ রয়েছে (এখানে দেখুন)

when :: Bool -> IO () -> IO ()
when condition action world =
    if condition
      then action world
      else ((), world)

লক্ষ্য করুন এই উদাহরণে, সংজ্ঞা IO aনেওয়া হয় হতে RealWorld -> (a, RealWorld)সবকিছু আরো বোধগম্য করা।

এই স্নিপেট শর্তসাপেক্ষে আইও মোনাডে একটি ক্রিয়া চালায়। এখন, অভিমানী যে conditionহয় False, অ্যাকশন actionকখনই চালানো উচিত। অলস শব্দার্থ ব্যবহার করা প্রকৃতপক্ষে এটি হবে। তবে এখানে উল্লেখ করা হয়েছে যে হাস্কেল প্রযুক্তিগতভাবে অ-কড়া কথা বলছেন। এর অর্থ হ'ল এই সংকলকটিকে অনুমতি দেওয়া হয়েছে, উদাহরণস্বরূপ, প্রাকৃতভাবে action worldএকটি ভিন্ন থ্রেডে চালানো , এবং পরে যখন এটি আবিষ্কার হয় তখন এটির প্রয়োজন হয় না তখন সেই গণনাটি ফেলে দেয়। তবে, ইতিমধ্যে পার্শ্ব প্রতিক্রিয়াগুলি ইতিমধ্যে ঘটবে।

এখন, কেউ আইও মনাদকে এমনভাবে প্রয়োগ করতে পারে যখন পুরো প্রোগ্রামটি শেষ হয়ে গেলে পার্শ্ব-প্রতিক্রিয়াগুলি কেবল তখনই প্রচারিত হয় এবং আমরা জানি ঠিক কোন পার্শ্ব-প্রতিক্রিয়াটি কার্যকর করা উচিত। তবে এটি হ'ল না, কারণ হাস্কেল-তে অসীম প্রোগ্রামগুলি লেখা সম্ভব, এর স্পষ্টভাবে অন্তর্বর্তী পার্শ্ব-প্রতিক্রিয়া রয়েছে।

এর অর্থ কি এই যে আইও মনাদ প্রযুক্তিগতভাবে ভুল, বা অন্য কিছু ঘটতে বাধা দিচ্ছে?


কম্পিউটার বিজ্ঞানে স্বাগতম ! আপনার প্রশ্নটি এখানে অফ-টপিক: আমরা কম্পিউটার বিজ্ঞানের প্রশ্নগুলির সাথে ডিল করি , প্রোগ্রামিং প্রশ্নগুলির সাথে নয় (আমাদের FAQ দেখুন )। আপনার প্রশ্ন স্ট্যাক ওভারফ্লোতে বিষয়যুক্ত হতে পারে ।
dkaeae

2
আমার মতে এটি একটি কম্পিউটার বিজ্ঞানের প্রশ্ন, কারণ এটি ব্যবহারিক প্রোগ্রামিং প্রশ্নের সাথে নয়, হাস্কেলের তাত্ত্বিক শব্দার্থবিজ্ঞানের সাথে সম্পর্কিত।
লাসে

4
আমি প্রোগ্রামিং ভাষা তত্ত্বের সাথে খুব বেশি পরিচিত নই, তবে আমার মনে হয় এই প্রশ্নটি এখানে অনন্য-বিষয়। আপনি এখানে 'ভুল' এর অর্থ কী তা যদি তা পরিষ্কার করে থাকেন তবে এটি সাহায্য করবে। আইও মনাদের এমন কোন সম্পত্তি থাকা উচিত নয় বলে আপনি কী ভাবেন?
বিচ্ছিন্ন টিকটিকি

1
এই প্রোগ্রামটি ভাল টাইপ করা হয় না। আপনি আসলে কী লিখতে চেয়েছিলেন তা আমি নিশ্চিত নই। সংজ্ঞাটি whenটাইপযোগ্য, তবে এতে আপনি যে ধরণের ঘোষণা করেন তা থাকে না এবং এই নির্দিষ্ট কোডটি কী আকর্ষণীয় করে তোলে তা আমি দেখতে পাই না।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

2
এই প্রোগ্রামটি সরাসরি উপরে লিঙ্কিত হাস্কেল-উইকি পৃষ্ঠা থেকে ভারব্যাটিম নেওয়া হয়েছে। এটি প্রকৃতপক্ষে টাইপ করে না। এটি কারণ IO এর ইন্টার্নালগুলি আরও পঠনযোগ্য করে তোলার জন্য এটি IO aসংজ্ঞার অধীনে রচনা করা হয়েছে RealWorld -> (a, RealWorld)
লাসে

উত্তর:


12

এটি IOমোনাডের একটি প্রস্তাবিত "ব্যাখ্যা" । আপনি যদি এই "ব্যাখ্যা "টিকে গুরুত্ব সহকারে নিতে চান তবে আপনার" রিয়েল ওয়ার্ল্ড "কে গুরুত্ব সহকারে নেওয়া দরকার। এটি অনুমানযোগ্য কিনা তা action worldঅনুমানযোগ্যভাবে মূল্যায়ন করা হয় বা না হয়, এর actionকোনও পার্শ্ব-প্রতিক্রিয়া নেই, এর প্রভাবগুলি যদি থাকে তবে মহাবিশ্বের নতুন অবস্থানে ফিরে আসে যেখানে এই প্রভাবগুলি দেখা গেছে, যেমন নেটওয়ার্ক প্যাকেট প্রেরণ করা হয়েছে। যাইহোক, ফাংশন ফলাফল ((),world)এবং সেইজন্য মহাবিশ্বের নতুন রাষ্ট্র world। আমরা নতুন মহাবিশ্ব ব্যবহার করি না যা আমরা অনুমানমূলকভাবে পাশাপাশি মূল্যায়ন করেছি। মহাবিশ্বের অবস্থা world

আপনি সম্ভবত এটি গুরুত্ব সহকারে নিতে একটি কঠিন সময় আছে। এটি বেশ কয়েকটি উপায়ে রয়েছে যা সর্বোপরি অতিষ্ঠভাবে প্যারাডক্সিকাল এবং অযৌক্তিক। সংমেয় বিশেষত হয় এই দৃষ্টিকোণ দিয়ে স্পষ্টতই না স্পষ্ট বা উন্মাদ।

"অপেক্ষা করুন, অপেক্ষা করুন," আপনি বলেছেন। " RealWorldএটি কেবল একটি 'টোকেন' actually এটি আসলে পুরো মহাবিশ্বের অবস্থা নয় " " ঠিক আছে, তাহলে এই "ব্যাখ্যা" কিছুই ব্যাখ্যা করে না। তবুও, বাস্তবায়নের বিশদ হিসাবে , এইভাবে জিএইচসি মডেল IO1 তবে এর অর্থ হ'ল আমাদের কাছে যাদুকরী "ফাংশন" রয়েছে যাগুলির আসলে পার্শ্ব প্রতিক্রিয়া হয় এবং এই মডেলটি তাদের অর্থের কোনও দিকনির্দেশনা সরবরাহ করে না। এবং, যেহেতু এই ফাংশনগুলির আসলে পার্শ্ব-প্রতিক্রিয়া রয়েছে, তাই আপনার উত্থাপিত উদ্বেগ সম্পূর্ণরূপে বিন্দু। 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, কিন্তু এটি রাষ্ট্র-পাসিং করছে না। জেএইচসি এবং ইউএইচসি মূলত জিএইচসি হিসাবে একই পদ্ধতির ব্যবহার করেছিল।


আপনার আলোকিত উত্তরের জন্য ধন্যবাদ, এটি সত্যই সহায়তা করেছিল। আপনার আইওর বাস্তবায়ন আমার মনকে ঘিরে ফেলতে কিছুটা সময় নিয়েছিল, তবে আমি সম্মত হই যে এটি আরও স্বজ্ঞাত। আপনি কি দাবি করছেন যে বাস্তবায়ন বাস্তবায়ন যেমন বাস্তবায়নগুলি যেমন পার্শ্ব-প্রতিক্রিয়া অর্ডার সহ সম্ভাব্য সমস্যাগুলি ভোগ করে না এই বাস্তবায়ন? আমি তাত্ক্ষণিকভাবে কোনও সমস্যা দেখতে পাচ্ছি না, তবে এগুলির অস্তিত্ব নেই তাও আমার কাছে পরিষ্কার নয়।
লাসে

একটি মন্তব্য: এটি OpenFile "foo" (\r -> ...)আসলে হওয়া উচিত বলে মনে হচ্ছে Request (OpenFile "foo") (\r -> ...)?
লাসে

@ লাস ইয়েপ, এটি থাকা উচিত ছিল Request। আপনার প্রথম প্রশ্নের উত্তর দেওয়ার জন্য, এটি IOমূল্যায়নের আদেশের (মডুলো বোতল) স্পষ্টভাবে সংবেদনশীল নয় কারণ এটি একটি জড় মূল্য। সমস্ত পার্শ্ব প্রতিক্রিয়া (যদি থাকে) এমন জিনিস দ্বারা তৈরি করা হবে যা এই মানটির ব্যাখ্যা করে। ইন whenউদাহরণস্বরূপ, এটা কোন ব্যাপার না তাহলে actionমূল্যায়ন হয়েছে, কারণ এটি শুধু একটি মান কেমন হবে Request (PutStr "foo") (...)যা আমরা জিনিস যাহাই হউক না কেন এই অনুরোধগুলি ব্যাখ্যা দিতে হবে না। এটি সোর্স কোডের মতো; আপনি আগ্রহী বা অলসভাবে এটি হ্রাস করেন কিনা তা বিবেচ্য নয়, এটি কোনও দোভাষীকে না দেওয়া পর্যন্ত কিছুই হয় না।
ডেরেক এলকিন্স

আহ্ হ্যাঁ আমি এটি দেখতে। এটি সত্যই চালাক সংজ্ঞা is প্রথমে আমি ভেবেছিলাম যে পুরো প্রোগ্রামটি সম্পাদন শেষ হলে সমস্ত পার্শ্ব-প্রতিক্রিয়া অগত্যা ঘটবে, কারণ আপনাকে ব্যাখ্যা করার আগে আপনাকে ডেটাস্ট্রাক্ট তৈরি করতে হবে। তবে যেহেতু একটি অনুরোধটিতে একটি ধারাবাহিকতা রয়েছে তাই আপনাকে Requestপার্শ্ব-প্রতিক্রিয়া দেখা শুরু করার জন্য কেবল খুব প্রথমটির ডেটা তৈরি করতে হবে । ধারাবাহিকতার মূল্যায়ন করার পরে পরবর্তী পার্শ্ব প্রতিক্রিয়া তৈরি করা যেতে পারে। চতুর!
লাসে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.