সি # তে, মোনাদ কী?


190

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

তবে আমি ল্যাম্বদা এক্সপ্রেশন এবং অন্যান্য কার্যকরী বৈশিষ্ট্যগুলি সহ সি # তে বেশ ভাল জানি। আমি জানি সি # এর কার্যকরী বৈশিষ্ট্যগুলির একটি উপসেট রয়েছে, এবং তাই সম্ভবত সি # তে মনড প্রকাশ করা যায় না।

তবে, ধারণাটি প্রকাশ করা কি সম্ভব? কমপক্ষে আমি আশা করি। হতে পারে আপনি একটি সি # উদাহরণটি একটি ভিত্তি হিসাবে উপস্থাপন করতে পারেন এবং তারপরে একটি সি # বিকাশকারী কী চান সেখান থেকে সে কি করতে পারে তা বর্ণনা করতে পারে তবে ভাষাতে কার্যকরী প্রোগ্রামিং বৈশিষ্ট্যগুলির অভাব আছে বলে তা করতে পারে না। এটি চমত্কার হবে, কারণ এটি মনদের উদ্দেশ্য এবং উপকারগুলি জানায়। সুতরাং এখানে আমার প্রশ্ন: আপনি একটি সি # 3 বিকাশকারীকে মনদেসে দিতে পারেন তার সেরা ব্যাখ্যাটি কী?

ধন্যবাদ!

(সম্পাদনা: যাইহোক, আমি জানি কমপক্ষে 3 টি "একটি মোনাদ কী" প্রশ্ন ইতিমধ্যে এসও-তে রয়েছে However তবে, আমি তাদের সাথে একই সমস্যার মুখোমুখি ... সুতরাং সি #-বিকাশকারীর কারণে এই প্রশ্নের ইমো প্রয়োজন o ফোকাস। ধন্যবাদ।)


দয়া করে নোট করুন যে এটি আসলে একটি সি # 3.0 বিকাশকারী। .NET 3.5 দিয়ে এটি ভুল করবেন না। তা ছাড়াও, দুর্দান্ত প্রশ্ন।
রাজ্জি

4
এটি উল্লেখ করার মতো যে লিনকিউ ক্যোয়ারী এক্সপ্রেশনগুলি সি # 3
এরিক ফোর্বস

1
আমি এখনও এটি একটি সদৃশ প্রশ্ন মনে করি। উত্তর এক stackoverflow.com/questions/2366/can-anyone-explain-monads এর প্রতি সংযোগ আছে channel9vip.orcsweb.com/shows/Going+Deep/... , যেখানে মন্তব্যের এক একটি খুব সুন্দর C # এর উদাহরণ রয়েছে। :)
জলফ

4
তবুও, এটি একটি প্রশ্নের উত্তর থেকে কেবলমাত্র একটি লিঙ্ক S আমি সি # বিকাশকারীদের উপর কেন্দ্রীভূত একটি প্রশ্নের মান দেখতে পাচ্ছি। এটি এমন একটি কাজ যা আমি এমন কোনও কার্যনির্বাহী প্রোগ্রামারকে জিজ্ঞাসা করব যিনি যদি আমি একজনকে জানতাম তবে সি # করত, সুতরাং এটির কাছে এটি জিজ্ঞাসা করা যুক্তিসঙ্গত বলে মনে হয়। তবে আমি আপনার মতামতের অধিকারকেও সম্মান করি।
চার্লি ফুল

1
একটি উত্তর যদিও আপনার প্রয়োজন সমস্ত নয়? ;) আমার বক্তব্যটি হ'ল অন্য প্রশ্নগুলির মধ্যে একটি (এবং এখন
এটিও একইভাবে

উত্তর:


147

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

একটি মোনাড এই "গণনার সংমিশ্রণ" করার কিছু উপায়।

সাধারণত দুটি গণনা একত্রিত করার জন্য আপনার সবচেয়ে বেসিক "অপারেটর" হলেন ;:

a; b

আপনি যখন এটি বলবেন তখন আপনার অর্থ "প্রথমে কর a, তারপরে b"। ফলাফলটি a; bমূলত আবার একটি গণনা যা আরও স্টাফের সাথে একত্রিত হতে পারে। এটি একটি সরল মোনাড, এটি ছোট কম্পিউটারগুলিকে বড়দের সাথে সংযুক্ত করার একটি উপায়। ;বলে "বাম জিনিস করতে, তারপর ডান দিকে জিনিস করতে"।

অবজেক্ট ওরিয়েন্টেড ভাষাগুলিতে মোনাড হিসাবে দেখা যায় এমন আরও একটি জিনিস .। প্রায়শই আপনি এই জাতীয় জিনিসগুলি পান:

a.b().c().d()

.মূলত মানে হলো "বাম গণনার মূল্যায়ন, এবং তারপর যে ফলাফলে ডান দিকে পদ্ধতি কল"। এটি ফাংশন / গণনা একত্রিত করার অন্য উপায়, এর চেয়ে কিছুটা জটিল ;। এবং জিনিসগুলিকে এক সাথে শৃঙ্খলাবদ্ধ করার ধারণাটি .একটি মোনাদ, যেহেতু এটি একটি নতুন সংখ্যায় দুটি গুণকে একত্রিত করার উপায়।

আর একটি মোটামুটি সাধারণ মোনাড, যার কোনও বিশেষ সিনট্যাক্স নেই, এটি হ'ল:

rv = socket.bind(address, port);
if (rv == -1)
  return -1;

rv = socket.connect(...);
if (rv == -1)
  return -1;

rv = socket.send(...);
if (rv == -1)
  return -1;

-1 এর রিটার্ন মান ব্যর্থতা নির্দেশ করে, তবে এই ত্রুটিটি পরীক্ষা করে বিমূর্ত করার কোনও আসল উপায় নেই, এমনকি আপনার প্রচুর এপিআই-কল রয়েছে যা আপনাকে এই ফ্যাশনে একত্রিত করতে হবে। এটি মূলত অন্য একটি মোনাড যা নিয়মের মাধ্যমে ফাংশন কলগুলিকে একত্রিত করে "যদি বামদিকে ফাংশন -1 ফিরে আসে তবে নিজেই -1 করুন, অন্যথায় ডানদিকে ফাংশনটি কল করুন"। আমাদের যদি এমন কোনও অপারেটর থাকে >>=যা এই কাজটি করে তবে আমরা কেবল লিখতে পারি:

socket.bind(...) >>= socket.connect(...) >>= socket.send(...)

এটি জিনিসগুলিকে আরও পঠনযোগ্য করে তুলবে এবং ফাংশনগুলির সংমিশ্রণের আমাদের বিশেষ পদ্ধতিটিকে বিমূর্ত করতে সহায়তা করবে, যাতে আমাদের বারবার নিজেকে পুনরাবৃত্তি করার প্রয়োজন হয় না।

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

উদাহরণস্বরূপ, >>=উপরেরটি "ত্রুটি পরীক্ষা করার জন্য এবং তারপরে সকেটের ডান দিকটি কল করুন যা আমরা ইনপুট হিসাবে পেয়েছি" তে প্রসারিত হতে পারে, যাতে আমাদের স্পষ্টভাবে socketঅনেক বার নির্দিষ্ট করার প্রয়োজন হয় না :

new socket() >>= bind(...) >>= connect(...) >>= send(...);

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


28
দুর্দান্ত উত্তর! আমি অলিভার স্টিলের একটি উদ্ধৃতি লিখতে যাচ্ছি, ওভারলোডিং-ল সি ++ বা সি # এর সাথে মনডসকে সম্পর্কিত করার চেষ্টা করছি: Monads আপনাকে '' ওভারলোড করার অনুমতি দেয়; অপারেটর.
J:12rg ডব্লু মিটাগ

6
@ জার্গডব্লিউমিতাগ আমি এই উদ্ধৃতিটি আগে পড়েছিলাম, তবে এটি অত্যধিক মাথাব্যথাহীন বাজে কথা বলে মনে হচ্ছে। এখন যে আমি মনড বুঝতে পারি এবং কীভাবে ';' এর এই ব্যাখ্যাটি পড়েছি; এক, আমি পেয়েছি তবে আমি মনে করি এটি বেশিরভাগ অপরিহার্য বিকাশকারীদের কাছে এটি একটি অযৌক্তিক বক্তব্য। ';' সবচেয়ে বেশি // এর চেয়ে অপারেটর হিসাবে দেখা হয় না।
জিমি हॉফা

2
আপনি কি নিশ্চিত যে আপনি জানেন যে একটি মোনাড কী? মনডস কোনও "ফাংশন" বা গণনা নয়, মনাদের জন্য নিয়ম রয়েছে।
লুই

আপনার ;উদাহরণে: কোন অবজেক্ট / ডেটা ;ম্যাপ করে? (মনে Listমানচিত্রগুলি Tথেকে List<T>) কীভাবে ;মধ্যে বস্তু / ডাটা ধরনের মানচিত্র morphisms / ফাংশন? কি pure, join, bindজন্য ;?
মিখা উইডেনম্যান

44

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

এবং গত রাতে, আমি এসেছিলাম এবং এই প্রতিক্রিয়াগুলি আবার পড়ি। সবচেয়ে গুরুত্বপূর্ণ হল , আমি পুনরায় পড়তে নির্দিষ্ট C # এর উদাহরণ টেক্সট মন্তব্য ব্রায়ান Beckman ভিডিও কেউ উপরে উল্লেখ । এটি এতটাই পরিষ্কার এবং আলোকিত ছিল যে আমি সরাসরি এটি এখানে পোস্ট করার সিদ্ধান্ত নিয়েছি।

কারণ এই মন্তব্যকারীকে না শুধুমাত্র আমার মনে হয় আমি বুঝতে পেরেছো ঠিক কি Monads হয় ... আমি বুঝতে পারছি আমি আসলে C # এর মধ্যে কিছু বিষয় আছে যা লিখেছি হয় Monads ... অথবা অন্তত খুব ঘনিষ্ঠ, এবং একই সমস্যার সমাধানের চেষ্টায় প্রস্থান করল।

সকল থেকে একটি সরাসরি উদ্ধৃতি এই - সুতরাং, এখানে মন্তব্য নেই মন্তব্য এখানে দ্বারা অরণ্যময় :

এটি বেশ দুর্দান্ত। যদিও এটি কিছুটা বিমূর্ত। আমি এমন লোকদের কল্পনা করতে পারি যারা প্রকৃত উদাহরণগুলির অভাবের কারণে কোন মনড ইতিমধ্যে বিভ্রান্ত হয়ে পড়ে জানেন না know

সুতরাং আমাকে মেনে চলার চেষ্টা করা যাক, এবং সত্যিই পরিষ্কার হওয়ার জন্য আমি সি # তে একটি উদাহরণ করব, যদিও এটি দেখতে কুৎসিত দেখাচ্ছে। আমি শেষে সমতুল্য হাস্কেল যুক্ত করব এবং আপনাকে শীতল হাস্কেল সিনট্যাকটিক চিনিটি দেখাব যা আইএমও, মনডস সত্যিই দরকারী হতে শুরু করে।

ঠিক আছে, সুতরাং সবচেয়ে সহজ Monad এক হ্যাশকেলে "হতে পারে monad" বলা হয়। সি # তে সম্ভবত টাইপ বলা হয় Nullable<T>। এটি মূলত একটি ক্ষুদ্র শ্রেণি যা কেবলমাত্র একটি মূল্যের ধারণাকে আবদ্ধ করে যা বৈধ এবং একটি মান রয়েছে, বা "নাল" এবং এর কোনও মূল্য নেই।

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

এখানে এমন প্রোগ্রাম যা পুরো বিষয়টিকে অনুপ্রাণিত করে (আমি Bindপরে সংজ্ঞা দিচ্ছি , এটি কেন সুন্দর তা আপনাকে দেখানোর জন্য)।

 class Program
    {
        static Nullable<int> f(){ return 4; }        
        static Nullable<int> g(){ return 7; }
        static Nullable<int> h(){ return 9; }


        static void Main(string[] args)
        {
            Nullable<int> z = 
                        f().Bind( fval => 
                            g().Bind( gval => 
                                h().Bind( hval =>
                                    new Nullable<int>( fval + gval + hval ))));

            Console.WriteLine(
                    "z = {0}", z.HasValue ? z.Value.ToString() : "null" );
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }
    }

এখন, এক মুহুর্তের জন্য উপেক্ষা করুন যে ইতিমধ্যে Nullableসি # তে এটি করার জন্য সমর্থন রয়েছে (আপনি একসাথে অবনমিত ints যুক্ত করতে পারেন এবং যদি নাল হয় তবে আপনি শূন্য হন)। আসুন ভান করুন যে এ জাতীয় কোনও বৈশিষ্ট্য নেই এবং এটি কেবল কোনও ব্যবহারকারী-সংজ্ঞায়িত শ্রেণীর সাথে বিশেষ কোনও যাদু নেই। মুল বক্তব্যটি হ'ল আমরা Bindআমাদের Nullableমানের বিষয়বস্তুগুলিতে কোনও পরিবর্তনশীলকে বাঁধতে ফাংশনটি ব্যবহার করতে পারি এবং তারপরে ভেবে দেখছি যে এখানে কোনও অদ্ভুত কিছুই হচ্ছে না, এবং এগুলি সাধারণ ইনটগুলির মতো ব্যবহার করে এবং কেবল তাদের একসাথে যুক্ত করতে পারি। আমরা শেষে একটি nullable মধ্যে ফলাফলের মোড়ানো, এবং যে nullable পারেন (যদি কোন নাল হতে হবে f, gবা hআয় নাল) অথবা এটা summing ফল কী হবে f, gএবংhএকসঙ্গে। (এটি কীভাবে আমরা লিনকিউ-র একটি ভেরিয়েবলের সাথে একটি ডাটাবেসে একটি সারি বাঁধতে পারি এবং এর সাথে স্টাফগুলি করতে পারি তা অপরিবর্তনীয়, যা Bindঅপারেটর নিশ্চিত করে যে চলকটি কেবল বৈধ সারি মান পাস করবে)।

আপনি এই সঙ্গে খেলা করতে পারেন এবং পরিবর্তন f, gএবং hনাল ফিরে যাওয়ার এবং আপনি সেই পুরো জিনিস ফিরে আসবে নাল দেখতে হবে।

সুতরাং পরিষ্কারভাবে বাইন্ড অপারেটরটি আমাদের জন্য এই চেকিং করতে হবে, এবং যদি এটি একটি নাল মানের মুখোমুখি হয় তবে নাল ফেরানো জামিন আউট, এবং অন্যথায় Nullableকাঠের অভ্যন্তরের মানটি ল্যাম্বডায় প্রবেশ করান।

Bindঅপারেটরটি এখানে :

public static Nullable<B> Bind<A,B>( this Nullable<A> a, Func<A,Nullable<B>> f ) 
    where B : struct 
    where A : struct
{
    return a.HasValue ? f(a.Value) : null;
}

এখানে টাইপগুলি ভিডিওর মতোই। এটি একটি M a ( Nullable<A>এই ক্ষেত্রে সি # সিনট্যাক্সে) aএবং M b( Func<A, Nullable<B>>সি # সিনট্যাক্সে) থেকে একটি ফাংশন নেয় এবং এটি একটি M b ( Nullable<B>) প্রদান করে।

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

মোনাডের সাথে আপনি করতে পারেন এমন অন্যান্য উদাহরণ রয়েছে। উদাহরণস্বরূপ আপনি Bindঅপারেটরটিকে অক্ষরের ইনপুট স্ট্রিমের যত্ন নিতে এবং পার্সার কম্বিনেটর লিখতে এটি ব্যবহার করতে পারেন। প্রতিটি পার্সার সংযুক্তকারী তখন ব্যাক-ট্র্যাকিং, পার্সার ব্যর্থতা ইত্যাদির মতো জিনিসগুলি সম্পর্কে পুরোপুরি অসচেতন হতে পারে এবং ছোট পার্সারগুলিকে একসাথে একত্রিত করতে পারে যেন জিনিসগুলি কখনই ভুল হয় না, এই জ্ঞানে নিরাপদ যে চতুর একটি কার্যকর প্রয়োগের Bindপিছনে সমস্ত লজিককে সাজিয়ে তোলে behind কঠিন বিট। তারপরে সম্ভবত কেউ মোনাডে লগিং যুক্ত করে, তবে মোনাড ব্যবহার করে কোড পরিবর্তন হয় না, কারণ সমস্ত ম্যাজিক Bindঅপারেটরের সংজ্ঞায় ঘটে , বাকি কোডটি অপরিবর্তিত থাকে।

অবশেষে, এখানে হাসকেলে একই কোডের প্রয়োগকরণ ( -- একটি মন্তব্য লাইনের শুরু)।

-- Here's the data type, it's either nothing, or "Just" a value
-- this is in the standard library
data Maybe a = Nothing | Just a

-- The bind operator for Nothing
Nothing >>= f = Nothing
-- The bind operator for Just x
Just x >>= f = f x

-- the "unit", called "return"
return = Just

-- The sample code using the lambda syntax
-- that Brian showed
z = f >>= ( \fval ->
     g >>= ( \gval ->  
     h >>= ( \hval -> return (fval+gval+hval ) ) ) )

-- The following is exactly the same as the three lines above
z2 = do 
   fval <- f
   gval <- g
   hval <- h
   return (fval+gval+hval)

আপনি দেখতে পাচ্ছেন doশেষে দুর্দান্ত স্বরলিপিটি এটিকে সরল আবশ্যক কোডের মতো দেখায়। এবং প্রকৃতপক্ষে এটি নকশা দ্বারা। মোনাডগুলি প্রয়োজনীয় কার্যকারী প্রোগ্রামিংয়ের সমস্ত দরকারী স্টাফগুলিকে আবদ্ধ করতে (পরিবর্তনযোগ্য অবস্থা, আইও ইত্যাদি) ব্যবহার করা যেতে পারে এবং এই দুর্দান্ত অত্যাবশ্যক-এর মতো সিনট্যাক্স ব্যবহার করে ব্যবহৃত হয় তবে পর্দার আড়ালে, এটি সমস্ত কেবল মনড এবং বাইন্ড অপারেটরের একটি চতুর বাস্তবায়ন! শীতল জিনিস যে আপনি প্রয়োগ করে আপনার নিজের monads বাস্তবায়ন করতে পারে >>=এবং return। এবং যদি আপনি এটি করেন তবে সেই মোনাডগুলি doস্বরলিপিটিও ব্যবহার করতে সক্ষম হবেন , যার অর্থ আপনি কেবল দুটি ফাংশন সংজ্ঞায়িত করে আপনার নিজের ছোট্ট ভাষা লিখতে পারেন!


3
ব্যক্তিগতভাবে আমি এফ # এর মোনাদের সংস্করণ পছন্দ করি তবে উভয় ক্ষেত্রেই তারা দুর্দান্ত।
কেওসপ্যান্ডিয়ন

3
এখানে ফিরে এসে আপনার পোস্ট আপডেট করার জন্য আপনাকে ধন্যবাদ। এটি এইগুলির মতো ফলোআপগুলি যা প্রোগ্রামাররা যারা কোনও নির্দিষ্ট অঞ্চলে সন্ধান করছে তাদের সত্যই বুঝতে পারে যে সহকারী প্রোগ্রামাররা চূড়ান্তভাবে কীভাবে ক্ষেত্রটিকে বিবেচনা করে বলে বিবেচনা করে, "আমি কীভাবে y প্রযুক্তিতে এক্স করব না" এর পরিবর্তে। তুমি দা মানুষ!
ক্যাপাসিমস

আপনি মূলত আপনি যে পথটি নিয়েছেন এবং একই স্থানে পৌঁছেছি সেখানে মনড বোঝে, এটি বলেছিল যে এটি কোনও মোনাডের বাধ্যতামূলক আচরণের একমাত্র সেরা ব্যাখ্যা যা আমি কখনও একজন অপরিহার্য বিকাশকারীকে দেখেছি। যদিও আমি মনে করি আপনি মনাদ সম্পর্কে সমস্ত কিছু সম্পর্কে স্পর্শ করছেন না যা উপরের স্টাফ দ্বারা কিছুটা আরও ব্যাখ্যা করা হয়েছে।
জিমি হোফা

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

মনে হচ্ছে প্রোগ্রামিংয়ের ক্ষেত্রে মোনাদ বিমূর্ততার উচ্চতর মাত্রা, বা এটি গণিতে কেবল একটি ধারাবাহিক এবং অ-পৃথক ফাংশন সংজ্ঞা। যে কোনও উপায়ে, এগুলি নতুন ধারণা নয়, বিশেষত গণিতে in
লিয়াং

11

একটি monad মূলত স্থগিত প্রক্রিয়াজাতকরণ। আপনি যদি এমন কোনও ভাষাতে পার্শ্ব প্রতিক্রিয়া (যেমন I / O) কোড লেখার চেষ্টা করছেন যা তাদের অনুমতি দেয় না এবং কেবল খাঁটি গণনার অনুমতি দেয় তবে একটি ডজ বলতে হবে, "ঠিক আছে, আমি জানি আপনি পার্শ্ব প্রতিক্রিয়াগুলি করবেন না আমার জন্য, তবে আপনি কি দয়া করে গণনা করতে পারেন যদি আপনি তা করেন? "

এটা এক ধরণের প্রতারণা।

এখন, এই ব্যাখ্যাটি আপনাকে মনদেদের বড় চিত্রের উদ্দেশ্য বুঝতে সহায়তা করবে, তবে শয়তান তার বিবরণে রয়েছে। কিভাবে ঠিক করবেন আপনি পরিণতি গনা? কখনও কখনও, এটি সুন্দর না।

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


1
আই রোবোট বইয়ের মতো? যেখানে বিজ্ঞানী কোনও কম্পিউটারকে স্পেস ট্র্যাভেল গণনার জন্য জিজ্ঞাসা করেন এবং তাদের নির্দিষ্ট নিয়ম এড়াতে বলেন? :) :) :) :)
অস্কাররেজ

3
হুম, একটি মোনাড ডিফার্ড প্রসেসিং এবং সাইড এফেক্টিং ফাংশনগুলি encapsulate করতে ব্যবহার করা যেতে পারে, এটি হ্যাসকেলে এটিই প্রথম আসল অ্যাপ্লিকেশন ছিল, তবে এটি আসলে আরও বেশি জেনেরিক প্যাটার্ন। অন্যান্য সাধারণ ব্যবহারগুলির মধ্যে ত্রুটি পরিচালনা ও রাষ্ট্র পরিচালনার অন্তর্ভুক্ত। সিনট্যাকটিক চিনি (হাস্কেল-এ করুন, F # তে গণনা এক্সপ্রেশন, সি # তে লিনক সিনট্যাক্স) কেবল এগুলি এবং মনাদাদের কাছে মৌলিক।
মাইক হ্যাডলো

@ মাইকহ্যাডলো: ত্রুটি পরিচালনা ( Maybeএবং Either e) এবং রাজ্য পরিচালনা ( State s, ST s) এর মোনাড উদাহরণগুলি "আপনি যদি [আমার পক্ষে পার্শ্ব প্রতিক্রিয়া] করেন তবে কি হবে তা গণনা করুন" এর বিশেষ উদাহরণ হিসাবে আমাকে আঘাত করেছে। অন্য উদাহরণ হ'ল ননডেটেরিনিজম ( [])।
পাইওন

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

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

4

আমি নিশ্চিত যে অন্যান্য ব্যবহারকারীরা গভীরতার সাথে পোস্ট করবেন, তবে আমি এই ভিডিওটিকে কিছুটা সহায়ক বলে মনে করেছি, তবে আমি বলব যে আমি এখনও ধারণার (যেমন) সমাধান করতে পারি না এমন ধারণাটির সাথে সাবলীলতার দিকে পৌঁছতে পারি না or মনডসের সাথে স্বজ্ঞাতভাবে সমস্যা।


1
আমি আরও বেশি সহায়ক বলে মনে করি তা হ'ল ভিডিওর নীচে সি # উদাহরণযুক্ত মন্তব্য।
জলফ

আমি আরও সহায়ক সম্পর্কে dunno , কিন্তু এটি অবশ্যই ধারণাগুলি অনুশীলন করা।
দ্য মিসিংলিংকিউ

0

ক্লাসগুলি প্রয়োগ করতে হবে এমন একটি সিinterface হিসাবে আপনি একটি মোনাডকে ভাবতে পারেন । এটি একটি ব্যবহারিক উত্তর যা আপনার ইন্টারফেসে এই ঘোষণাগুলি কেন পছন্দ করতে চান তার পিছনে সমস্ত বিভাগের তাত্ত্বিক গণিতকে উপেক্ষা করে এবং যে ভাষায় পার্শ্ব প্রতিক্রিয়া এড়ানোর চেষ্টা করে এমন ভাষাতে আপনি কেন monad রাখতে চান তার সমস্ত কারণ উপেক্ষা করে, তবে আমি (সি #) ইন্টারফেস বোঝে এমন কেউ হিসাবে এটি একটি ভাল সূচনা বলে মনে হয়েছিল।


তুমি কি বিস্তারিত বলতে পারো? এটি এমন একটি ইন্টারফেস সম্পর্কে কী যা এটি মনডের সাথে সম্পর্কিত?
জোয়েল কোহোর্ন 19

2
আমি মনে করি যে ব্লগ পোস্টটি এই প্রশ্নে উত্সর্গীকৃত বিভিন্ন অনুচ্ছেদ ব্যয় করে।
হাও

0

"একটি মোনাদ কী?" এ আমার উত্তর দেখুন ?

এটি একটি অনুপ্রেরণামূলক উদাহরণ দিয়ে শুরু হয়, উদাহরণের মাধ্যমে কাজ করে, একটি মনাদের উদাহরণ গ্রহণ করে এবং "মোনাড" আনুষ্ঠানিকভাবে সংজ্ঞায়িত করে।

এটি কার্যকরী প্রোগ্রামিংয়ের কোনও জ্ঞান ধরে না এবং এটি function(argument) := expressionসহজতম এক্সপ্রেশনগুলির সাথে সিনট্যাক্স সহ সিউডোকোড ব্যবহার করে।

এই সি # প্রোগ্রামটি সিউডোকোড মোনাডের একটি বাস্তবায়ন। (রেফারেন্সের জন্য: Mটাইপ কনস্ট্রাক্টর feedহ'ল "বাইন্ড" অপারেশন, এবং wrapএটি "রিটার্ন" অপারেশন))

using System.IO;
using System;

class Program
{
    public class M<A>
    {
        public A val;
        public string messages;
    }

    public static M<B> feed<A, B>(Func<A, M<B>> f, M<A> x)
    {
        M<B> m = f(x.val);
        m.messages = x.messages + m.messages;
        return m;
    }

    public static M<A> wrap<A>(A x)
    {
        M<A> m = new M<A>();
        m.val = x;
        m.messages = "";
        return m;
    }

    public class T {};
    public class U {};
    public class V {};

    public static M<U> g(V x)
    {
        M<U> m = new M<U>();
        m.messages = "called g.\n";
        return m;
    }

    public static M<T> f(U x)
    {
        M<T> m = new M<T>();
        m.messages = "called f.\n";
        return m;
    }

    static void Main()
    {
        V x = new V();
        M<T> m = feed<U, T>(f, feed(g, wrap<V>(x)));
        Console.Write(m.messages);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.