একটি কমোনাদ কী এবং সেগুলি কীভাবে কার্যকর?


16

সাম্প্রতিককালে আমি মনডস কীভাবে কাজ করে তা সম্পর্কে আমার জ্ঞানকে ধরিয়ে দিচ্ছি। আমি একটি 'কমোনাদ' ধারণার সাথেও পরিচয় করিয়েছি , যা একটি মোনাডের বিপরীত দ্বৈত হিসাবে বর্ণনা করা হয়েছে । যাইহোক, আমি এটি প্রায় আমার মাথা মোড়ানো অসম্ভব।

মনাদাদের বোঝার জন্য, আমি নিজের জন্য নিজস্ব উপমা তৈরি করেছি:

মনাদাদের 'এক্সপ্রেশনগুলির পরিবাহক বেল্ট তৈরির একটি নীলনকশা' হিসাবে দেখা যেতে পারে।

একটি নতুন মোনাডকে সংজ্ঞায়িত করতে (নতুন ধরণের কনভেয়র-বেল্ট সিস্টেম) আপনাকে সংজ্ঞা দিতে হবে:

  1. একটি পরিবাহক বেল্টে কিছু রাখার একটি উপায়, যেমন একটি পরিবাহক বেল্ট 'শুরু করুন'। (হিসাবে পরিচিত unitবা return)
  2. কোনও মেশিনকে সংযুক্ত করার একটি উপায় (একটি অভিব্যক্তি) যা একটি পরিবাহী বেল্টের একটি পরিবাহক বেল্টের অংশ হবে। (নামে পরিচিত joinবা bindবা >>=)।

(একটি তৃতীয় অপারেশন রয়েছে যা বর্তমান পরিবাহক বেল্ট নিয়ে যায়, এর সামগ্রীগুলি দূরে ফেলে দেয় এবং নতুন কনভেয়র বেল্ট হিসাবে পরিচিত হয় >>, তবে এটি খুব কম ব্যবহৃত হয়))

মেশিন এবং পরিবাহকরা একসাথে সঠিকভাবে কাজ করার জন্য, আপনাকে নিশ্চিত করতে হবে:

  1. আপনি যদি কোনও বাহক বেল্টে কিছু রেখে এবং এটি কোনও মেশিনের মাধ্যমে পাস করেন তবে আউটপুটটি মেশিনের মাধ্যমে ম্যানুয়ালি পাস করার সময় একই হওয়া উচিত। (বাম পরিচয়)
  2. আপনি যদি ইতিমধ্যে বিদ্যমান কনভেয়র বেল্টের মধ্যে একটি কনভেয়র-বেল্ট রাখতে চান, তবে আপনার একটি পরিবাহক বেল্টটি শেষ হবে না যার উপরে একটি পরিবাহক বেল্ট রয়েছে, বরং একটি একক, দীর্ঘতর পরিবাহক বেল্ট। (সঠিক পরিচয়)
  3. আপনি যদি ম্যানুয়ালি মেশিন এ ব্যবহার করেন, এবং তারপরে কনভেয়র-সংযুক্ত বিসি-এর মাধ্যমে ফলাফলটি পাস করেন, বা আপনি যদি কনভেয়র-সংযুক্ত এবি ব্যবহার করেন এবং ফলস্বরূপ সি'র মাধ্যমে ম্যানুয়ালি পাস করেন তবে আউটপুটটির জন্য এটি বিবেচনা করা উচিত নয়: ((a >> = খ) >> = গ) (a >> = (খ >> = সি)) (সমিতি) এর মতো হওয়া উচিত

সর্বাধিক সাধারণ পরিবাহক-বেল্টটি এমনটি হবে যা কেবল ইনপুট নেয় এবং সর্বদা পরবর্তী অভিব্যক্তিতে অবিরত থাকে। এটিই 'পাইপলাইন'।

আর একটি সম্ভাবনা হ'ল যদি এটির পরবর্তী মেশিনটির মাধ্যমে কিছু শর্তটি মানটির জন্য পূরণ করা হয়। এর অর্থ হ'ল যদি এর মধ্যে কিছু ভাবের মধ্যে, মানটি এমন কিছুতে পরিবর্তিত হয় যা আর অনুমোদিত হয় না, তবে বাকী বাক্সগুলি ছেড়ে দেওয়া হবে। 'সম্ভবত' মনাদ হ্যাসকেলে এটি করে।

আপনি কোনও যন্ত্রে পাস করার আগে বা পরে মানগুলিতে অন্যান্য অভিনব শর্তসাপেক্ষ অনুলিপি / পরিবর্তন নিয়মগুলিও করতে পারেন। উদাহরণ: পার্সার্স (এখানে, যদি কোনও অভিব্যক্তি একটি 'ব্যর্থতা' ফলাফল প্রদান করে, এক্সপ্রেশনটি আউটপুট হিসাবে ব্যবহৃত হওয়ার আগে থেকে প্রাপ্ত মান )।

অবশ্যই উপমাটি নিখুঁত নয়, তবে আমি আশা করি এটি কীভাবে মনডসের কাজ করে তার একটি যথাযথ উপস্থাপনা দেয়।

যাইহোক, কমোনাদস বোঝার জন্য এই উপমাটি তার মাথায় ঘুরিয়ে দিতে আমার অনেক সমস্যা হচ্ছে। একটি কমোনাড সংজ্ঞায়িত ইন্টারনেটে আমি যে পরিমাণ অল্প পরিমাণে তথ্য পেয়েছি তা থেকে আমি জানি:

  • extract, যা বিপরীত ধরণের return, এটি একটি কমোনাদ থেকে একটি মান লাগে ।
  • duplicate, যা বিপরীত প্রকারের সাজান join, এটি একটি এক থেকে দুটি কমোনাদ তৈরি করে।

তবে কীভাবে কোনও কমোনাদকে তাত্ক্ষণিকভাবে ব্যবহার করা যেতে পারে যদি আমরা কেবল সেগুলি থেকে নিষ্কাশন করতে বা সেগুলি নকল করতে পারি? এবং এগুলি আসলে কীভাবে ব্যবহার করা যায়? আমি এই খুব আশ্চর্যজনক প্রকল্প এবং এটি সম্পর্কে আলাপটি দেখেছি (যা দুর্ভাগ্যক্রমে আমি খুব কমই বুঝতে পেরেছিলাম), তবে আমি নিশ্চিত নই যে কার্যক্ষমতার কোন অংশটি কোনও কমোনাদ দ্বারা সরবরাহ করেছে provided

কমোনাদ কী? তারা কি জন্য দরকারী? সেগুলি কীভাবে ব্যবহার করা যায়? এগুলি কি ভোজ্য?


2
"আমরা যদি কেবলমাত্র সেগুলি থেকে নিষ্কাশন করতে বা সেগুলির সদৃশ করতে সক্ষম হই তবে কোনও কমোনাদ কীভাবে তাড়াতাড়ি করা যায়?" - আমি আপনার প্রশ্নের উত্তরটি একটি প্রশ্নের সাথে দেব: আপনি যদি কেবল তাদের মধ্যে মানগুলি এবং ক্রম সংখ্যায় তুলতে সক্ষম হন তবে কীভাবে একটি মোনাড গ্রাস করা যায়?
বেনিয়ামিন হজসন

1
"কনভেয়র বেল্টের শেষে মেশিন" (একপাশে: আমি IOমনাদ সম্পর্কে কথা বলার সময় সেই উপমাগুলি খুঁজে পাই না) হ্যাস্কেল রানটাইম সিস্টেম, যা অনুরোধ করে main। এর রয়েছে unsafePerformIOঅবশ্যই। আপনি যদি Maybe"কনভেয়র বেল্টের শেষে মেশিন" ব্যবহার করে মোনাডকে ভাবতে চান তবে আপনি ব্যবহার করতে পারেন maybe
বেনিয়ামিন হজসন

1
তবে, আপনার ব্যাখ্যাটি ঘুরিয়ে দেওয়ার সময়, আপনি যখন cobindঅ্যাপ্লিকেশনগুলির একটি শৃঙ্খলের শুরুতে একটি কমোনাদিক মান তৈরি করতে চান , তখন অবশ্যই কিছু ফাংশন থাকতে হবে যা আপনার কমোনাদের অভ্যন্তরীণ উপস্থাপনের জন্য দরকারী কিছু করে।
বেনিয়ামিন হজসন

2
comonad বা একসংখ্যা নির্দিষ্ট উদাহরণস্বরূপ পরিষ্কারভাবে অধিক কার্যকারিতার চেয়ে মাত্র typeclasses বাস্তবায়ন প্রয়োজন থাকতে পারে
জে।

2
আপনি যদি এই প্রশ্নটি বিভাগ-তাত্ত্বিক / গাণিতিক দিক থেকে না যান তবে এটি সহায়ক হতে পারে তা নয়, তবে আমি এটি উল্লেখ করতে চেয়েছিলাম যে একটি কমোনাদ বিপরীত নয় বরং একটি মোনাডের দ্বৈত
Jörg ডব্লু মিটাগ

উত্তর:


11

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

বিভাগের তত্ত্বে রয়েছে categories, যা সংক্ষিপ্তভাবে objects(যে কোনও প্রকারের বা প্রকৃতির, অভ্যন্তরীণ কাঠামোটি অপ্রাসঙ্গিক) এবং কিছু arrowsএই বস্তুর মধ্যে একটি সংকলন দেওয়া হয় । কোনও বিষয়শ্রেণীতে পরিণত হওয়ার জন্য তীরগুলি অবশ্যই কিছু আইন অনুসরণ করবে (বাম / ডান-পরিচয় এবং সাহচর্য), তবে এটি এখানে গুরুত্বপূর্ণ নয়।

এখন, বিভাগের তত্ত্বটি খুব বিমূর্ত / খাঁটি করা শক্ত এবং বিশাল। এটির মধ্য দিয়ে যেতে অনেক সময় লাগে (এবং আমি এটি আনুষ্ঠানিকভাবে অধ্যয়ন করি নি, আমি কেবল কয়েকটি বেসিক জানি), তবে একটি ধারণা ব্যবহৃত হয় যা একে বলে dual। মূলত, প্রতিটি বিভাগের জন্য আপনি opposite categoryকেবল একই কাজ করে "সমস্ত তীরগুলি বিপরীত করে" একটি নির্মাণ করতে পারেন । এটি একটি খুব নিষ্পাপ সংজ্ঞা তবে সংক্ষিপ্ত করার চেষ্টা করা শক্ত hard সি ক্যাটাগরির কোনও কিছুর দ্বৈত মূলত বিপরীত বিভাগের সি_ওপটিতে একই জিনিস (এখনও মাথা ব্যথা হচ্ছে?)

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

এরিক মেইজার এবং ব্রায়ান বেকম্যানের মধ্যে এই আলোচনায় আরও একটি "হ্যান্ডস-অন" বিবরণ পাওয়া যাবে যেখানে তারা দ্বৈততার ধারণা নিয়ে আলোচনা করছেন এবং এরিক কীভাবে IEnumerable<T>সি # তে "তীরগুলি উল্টে" চলেছেন? প্রতিক্রিয়াশীল কাঠামো তৈরি করা এবং IObservable<T>(যা আমি যতদূর বলতে পারি, এবং আমি সংশোধন করে খুশি, মূলত একটি তালিকা কমোনাদ উদাহরণ)।

ভিডিওতে উল্লিখিত কমোনাডগুলির আর একটি ব্যবহারিক উদাহরণ হ'ল Task<T>। নেট টাইপ, যেখানে Task<U> ContinueWith<U>(Func<Task<T>, U>)দ্বৈত হবে bind(বা SelectManyএটি সি # তে বলা হয়)


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