রাজ্য, এসটি, আইওরিফ এবং এমভিয়ারের মধ্যে পার্থক্য


91

আমি 48 ঘন্টা ( নিজেকে প্রায় 85 ঘন্টা পর্যন্ত) স্ক্রাইট লিখনের মাধ্যমে কাজ করছি এবং আমি ভেরিয়েবল এবং অ্যাসাইনমেন্ট যুক্ত করার অংশটি পেয়েছি । এই অধ্যায়ে একটি বৃহত্তর ধারণাগত লাফ রয়েছে, এবং আমি আশা করি এটি দুটি ধাপে একটি ভাল রিফ্যাক্টরিংয়ের সাথে করা হয়েছে বরং তারপরে সরাসরি চূড়ান্ত সমাধানে ঝাঁপিয়ে পড়ে। যাইহোক ...

আমি যে একই উদ্দেশ্য পরিবেশন বলে মনে হচ্ছে বিভিন্ন শ্রেণীর একটি নম্বর হারালেন অর্জিত করেছি: State, ST, IORef, এবং MVar। প্রথমটি তিনটিতে লেখায় উল্লেখ করা হয়েছে, যদিও শেষটি প্রথম তিনটি সম্পর্কে স্ট্যাকওভারফ্লো প্রশ্নের অনেক পক্ষে অনুকূল উত্তর বলে মনে হচ্ছে। তারা সবাই মনে হয় একটানা অনুরোধের মধ্যে একটি রাষ্ট্র বহন করে।

এগুলির প্রত্যেকটি কী এবং কীভাবে তারা একে অপরের থেকে পৃথক হয়?


বিশেষত এই বাক্যগুলি বোঝায় না:

পরিবর্তে, আমরা রাষ্ট্র থ্রেড নামে একটি বৈশিষ্ট্য ব্যবহার করি , যা হাস্কেলকে আমাদের জন্য সমষ্টিগত অবস্থা পরিচালনা করতে দেয়। এটি আমাদের পরিবর্তনশীল ভেরিয়েবলগুলি যেমন ভেরিয়েবলগুলি পেতে বা সেট করতে ফাংশনগুলি ব্যবহার করে অন্য কোনও প্রোগ্রামিং ভাষায় করতে পারে তেমন আচরণ করতে দেয়।

এবং

আইওরিফ মডিউল আপনাকে আইও মোনাডের মধ্যে রাষ্ট্রীয় পরিবর্তনশীলগুলি ব্যবহার করতে দেয় ।

এই সব লাইন type ENV = IORef [(String, IORef LispVal)]গুলিয়ে তোলে - দ্বিতীয় কেন IORef? type ENV = State [(String, LispVal)]পরিবর্তে লিখলে কী ভাঙবে ?

উত্তর:


119

রাজ্য মোনাড: পরিবর্তনীয় রাষ্ট্রের একটি মডেল

সরকারী এপিআই সহ রাজ্য সহ প্রোগ্রামগুলির জন্য রাজ্য মনড খাঁটি কার্যকরী পরিবেশ:

  • পাওয়া
  • করা

এমটিএল প্যাকেজে ডকুমেন্টেশন ।

নিয়ন্ত্রণের একক থ্রেডে রাষ্ট্রের প্রয়োজনের সময় সাধারণত রাজ্য মোনাড ব্যবহৃত হয়। এটি বাস্তবায়নে বাস্তবে পরিবর্তনীয় অবস্থা ব্যবহার করে না। পরিবর্তে, প্রোগ্রামটি রাষ্ট্রীয় মান দ্বারা প্যারামিটারাইজড হয় (অর্থাত্ রাষ্ট্র সকল গণনার অতিরিক্ত পরামিতি)। রাজ্যটি কেবল একটি একক থ্রেডে রূপান্তরিত হবে বলে মনে হয় (এবং থ্রেডের মধ্যে ভাগ করা যায় না)।

এসটি মোনাড এবং স্ট্রাফস

এসটি মোনাড আইও মোনাডের সীমাবদ্ধ চাচাতো ভাই।

এটি মেশিনে প্রকৃত মিউটেবল মেমরিরূপে প্রয়োগ করা স্বেচ্ছাসেবী পরিবর্তনযোগ্য রাষ্ট্রকে মঞ্জুরি দেয় । এআইপিটি পার্শ্ব-প্রভাব-মুক্ত প্রোগ্রামগুলিতে সুরক্ষিত করা হয়েছে, যেহেতু র‌্যাঙ্ক -2 টাইপ প্যারামিটারগুলি এমন মানগুলিকে বাধা দেয় যা স্থানীয় স্কোপ থেকে পালানোর থেকে পরিবর্তনীয় স্থিতির উপর নির্ভর করে।

এটি এইভাবে অন্যথায় বিশুদ্ধ প্রোগ্রামগুলিতে নিয়ন্ত্রিত পরিবর্তনের জন্য অনুমতি দেয়।

পরিবর্তনীয় অ্যারে এবং অন্যান্য ডেটা স্ট্রাকচারের জন্য সাধারণত ব্যবহৃত হয় যা রূপান্তরিত হয়, তারপরে হিমশীতল। এটি খুব কার্যকর, যেহেতু পরিবর্তনীয় স্থিতিটি "হার্ডওয়্যার ত্বরণযুক্ত"।

প্রাথমিক API:

এটিকে আইও মোনাডের কম বিপজ্জনক ভাইবাল হিসাবে ভাবেন। বা আইও, যেখানে আপনি কেবল মেমরি পড়তে এবং লিখতে পারবেন।

আইওরিফ: আইও-তে স্ট্রাফ

এগুলি আইও মোনাডে স্ট্রিফগুলি (উপরে দেখুন)। এলাকা সম্পর্কে স্ট্রিফের মতো তাদের সুরক্ষার গ্যারান্টি নেই।

এমওয়ারস: লক সহ আইওরিফ

একাধিক থ্রেড থেকে নিরাপদ একযোগে অ্যাক্সেসের জন্য স্ট্রিফ বা আইওআরএফগুলির মতো তবে লকযুক্ত সংযুক্ত রয়েছে । আইওআরএফ এবং স্ট্র্যাফগুলি ব্যবহার করার সময় কেবল একটি মাল্টি-থ্রেডড সেটিংয়ে নিরাপদ থাকে atomicModifyIORef(একটি তুলনা-এবং-স্বাপের পারমাণবিক ক্রিয়াকলাপ)। MVars হ'ল নিরাপদে পরিবর্তনীয় স্থিতি ভাগ করে নেওয়ার জন্য আরও সাধারণ প্রক্রিয়া।

সাধারণত হাস্কেল-তে এমআরভিস বা টিভি (এসটিএম-ভিত্তিক মিউটেবল সেল) স্ট্র্যাফ বা আইওরিফ ব্যবহার করুন।


4
এমভার্সে এম এবং টিভিতে টি কী করে? আমি "মিউটটেবল", "লেনদেন" অনুমান করছি। আকর্ষণীয় কীভাবে এসটি মানে স্টেট থ্রেড।
সিএমসিডিগ্রাগনকাই

10
আপনি কেন বলেন যে MVarএটির চেয়ে বেশি পছন্দ করা উচিত STRef? STRefগ্যারান্টি দেয় যে কেবল একটি থ্রেড এটির পরিবর্তন করতে পারে (এবং অন্য ধরণের আইও হতে পারে না) - অবশ্যই যদি আমার পরিবর্তনীয় স্থানে একযোগে অ্যাক্সেসের প্রয়োজন না হয় তবে এটি আরও ভাল?
বেঞ্জামিন হজসন

@ সিএমসিডিগ্রাগনকাই আমি সবসময় এম ধরে নিয়েছি এম মিটেক্সের জন্য, তবে আমি এটি কোথাও নথিভুক্ত দেখতে পাচ্ছি না।
অ্যান্ড্রু থাডিয়াস মার্টিন

37

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

MVarমূলত দুটি খুব গুরুত্বপূর্ণ পার্থক্য বাদে আইওআরএফ হিসাবে একই জিনিস। MVarএটি একটি সহকারী আদিম, তাই এটি একাধিক থ্রেড থেকে অ্যাক্সেসের জন্য ডিজাইন করা হয়েছে। দ্বিতীয় পার্থক্যটি হ'ল একটি MVarহ'ল একটি বাক্স যা পূর্ণ বা খালি থাকতে পারে। তাই যেখানে একটি IORef Intসবসময় একটি হয়েছে Int(অথবা নীচে হয়), একটি MVar Intএকটি থাকতে পারে Intবা এটা খালি হতে পারে। যদি কোনও থ্রেড শূন্য থেকে কোনও মান পড়ার চেষ্টা করে তবে তা পূরণ MVarনা হওয়া অবধি ব্লক MVarহয়ে যাবে (অন্য থ্রেড দ্বারা)। মূলত একটি অতিরিক্ত শব্দার্থক MVar aসমান IORef (Maybe a)যা সমঝোতার জন্য দরকারী।

Stateএকটি মোনাড যা পরিবর্তনীয় রাষ্ট্র সরবরাহ করে, আইওয়ের সাথে অগত্যা নয়। আসলে এটি খাঁটি গণনার জন্য বিশেষভাবে কার্যকর। আপনার যদি অ্যালগরিদম থাকে যা রাষ্ট্র ব্যবহার করে তবে তা নয় IO, একটি Stateমোনাদ প্রায়শই একটি মার্জিত সমাধান।

স্টেটের একটি মোনাড ট্রান্সফর্মার সংস্করণও রয়েছে StateT। এটি প্রায়শই প্রোগ্রামের কনফিগারেশন ডেটা, বা অ্যাপ্লিকেশনগুলিতে "গেম-ওয়ার্ল্ড-স্টেট" ধরণের রাজ্য ধারণ করতে ব্যবহৃত হয়।

STকিছুটা আলাদা কিছু। এর মধ্যে প্রধান ডেটা স্ট্রাকচারটি STহ'ল STRefযা IORefভিন্ন মনাডের মতো তবে। STএকসংখ্যা ব্যবহারসমূহ টাইপ সিস্টেম কপট ( "রাষ্ট্র থ্রেড" ডক্স উল্লেখ) তা নিশ্চিত করার জন্য চপল তথ্য একসংখ্যা অব্যাহতি পারে না; এটি হ'ল, আপনি যখন কোনও এসটি গণনা চালান তখন আপনি খাঁটি ফলাফল পাবেন। এসটি আকর্ষণীয় হওয়ার কারণটি হ'ল এটি আইওর মতো একটি আদিম মনড, গণনাগুলিকে বাইটারে এবং পয়েন্টারগুলিতে নিম্ন-স্তরের ম্যানিপুলেশনগুলি সম্পাদন করার অনুমতি দেয়। এর অর্থ STএটি পরিবর্তনীয় ডেটাতে নিম্ন-স্তরের অপারেশনগুলি ব্যবহার করার সময় একটি খাঁটি ইন্টারফেস সরবরাহ করতে পারে, যার অর্থ এটি খুব দ্রুত। প্রোগ্রামের দৃষ্টিকোণ থেকে, এটি STগণনাটি থ্রেড-লোকাল স্টোরেজ সহ একটি পৃথক থ্রেডে চলমান।


17

অন্যরা মূল কাজটি করেছেন তবে সরাসরি প্রশ্নের উত্তর দিতে:

এই সমস্ত লাইন টাইপ ENV = IORef [(String, IORef LispVal)] বিভ্রান্তিকর করে তোলে । দ্বিতীয় আইওরিফ কেন? আমি type ENV = State [(String, LispVal)]পরিবর্তে কি করলে ব্রেক হবে?

লিস্প একটি পরিবর্তনশীল রাষ্ট্র এবং লেক্সিকাল স্কোপ সহ একটি কার্যকরী ভাষা। কল্পনা করুন আপনি একটি পরিবর্তনীয় ভেরিয়েবল বন্ধ করে দিয়েছেন। এখন আপনি কিছু অন্যান্য ফাংশনের অভ্যন্তরে ঝুলন্ত এই পরিবর্তনশীলটির একটি রেফারেন্স পেয়েছেন - বলুন (হ্যাশেল স্টাইলের সিউডোকোডে) (printIt, setIt) = let x = 5 in (\ () -> print x, \y -> set x y)। আপনার এখন দুটি ফাংশন রয়েছে - একটি প্রিন্ট x, এবং একটিতে এর মান সেট করে। যখন আপনি মূল্যায়ন printIt, আপনি অনুসন্ধান করতে চান নাম প্রাথমিক পরিবেশে এক্স যা এর printItসংজ্ঞায়িত করা হয়, কিন্তু আপনি লুকআপ চান মান যে নাম যা পরিবেশের মধ্যে আবদ্ধ হয় printItহয় নামক (পরে setItহতে পারে সময়ের কোন সংখ্যা বলা হয়েছে )।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.