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