# 1 এবং # 2 দর্শনগুলি সাধারণভাবে ভুল।
- যে কোনও ডেটা ধরণের ধরণের
* -> *
লেবেল হিসাবে কাজ করতে পারে, ম্যানডস এর চেয়ে অনেক বেশি।
- (
IO
মোনাড বাদে ) একটি মোনাডের মধ্যে গণনা অপরিষ্কার নয়। এগুলি কেবল এমন গণনা উপস্থাপন করে যা আমরা পার্শ্ব প্রতিক্রিয়া হিসাবে দেখছি, তবে সেগুলি খাঁটি।
এই দুটি ভুল বোঝাবুঝি IO
মনাদকে কেন্দ্র করেই এসেছে যা আসলে কিছুটা বিশেষ।
সম্ভব হলে বিভাগের তত্ত্বে না গিয়ে আমি # 3 কে আরও বিস্তৃত করার চেষ্টা করব।
স্ট্যান্ডার্ড গণনা
একটি কার্মিক প্রোগ্রামিং ভাষা সকল কম্পিউটেশন একটি উৎস ধরণ এবং একটি টার্গেট ধরনের সঙ্গে ফাংশন হিসেবে দেখা যেতে পারে: f :: a -> b
। যদি কোনও ফাংশনে একাধিক আর্গুমেন্ট থাকে তবে আমরা কারি করে এটি এক-যুক্তি ফাংশনে রূপান্তর করতে পারি ( হাস্কেল উইকিও দেখুন )। এবং যদি আমরা শুধু একটি মূল্য আছে (0 আর্গুমেন্ট সহ একটি ফাংশন), আমরা এটি একটি ফাংশন যে একটি আর্গুমেন্ট নেয় মধ্যে রূপান্তর করতে পারেন ইউনিট টাইপ : ।x :: a
(\_ -> x) :: () -> a
.
অপারেটর ব্যবহার করে এই জাতীয় ফাংশন রচনা করে আমরা আরও জটিল প্রোগ্রামগুলি আরও সহজতর আকারে তৈরি করতে পারি । উদাহরণস্বরূপ, যদি আমাদের থাকে f :: a -> b
এবং g :: b -> c
আমরা পাই g . f :: a -> c
। নোট করুন যে এটি আমাদের রূপান্তরিত মানগুলির জন্যও কাজ করে: আমাদের যদি x :: a
এটি থাকে এবং এটি আমাদের প্রতিনিধিত্বতে রূপান্তরিত করে, আমরা পাই f . ((\_ -> x) :: () -> a) :: () -> b
।
এই উপস্থাপনার কিছু খুব গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে, যথা:
- আমাদের একটি খুব বিশেষ ফাংশন রয়েছে - প্রতিটি ধরণের জন্য পরিচয় ফাংশন । এটি সম্মানের সাথে একটি পরিচয় উপাদান : উভয় এবং সমান ।
id :: a -> a
a
.
f
f . id
id . f
- ফাংশন রচনা অপারেটর
.
হয় মিশুক ।
মোনাডিক গণনা
মনে করুন আমরা কয়েকটি বিশেষ বিভাগের গণনা বাছাই করে কাজ করতে চাই, যার ফলাফলটিতে একক রিটার্ন মান ছাড়া আরও কিছু রয়েছে। আমরা "আরও কিছু" এর অর্থ কী তা নির্দিষ্ট করে বলতে চাই না, আমরা জিনিসগুলি যতটা সম্ভব সাধারণ রাখতে চাই। "আরও কিছু" উপস্থাপনের সর্বাধিক সাধারণ উপায় এটিকে প্রকারের ফাংশন হিসাবে উপস্থাপন করে - m
এক ধরণের * -> *
(যেমন এটি এক প্রকারকে অন্য রূপান্তর করে)। সুতরাং আমরা প্রতিটি বিভাগে যে কাজ করতে চাই তার জন্য আমাদের কিছু ধরণের ফাংশন থাকবে m :: * -> *
। (ইন Haskell,, m
হয় []
, IO
, Maybe
, ইত্যাদি) এবং বিভাগ ইচ্ছার ধরনের সব ফাংশন রয়েছে a -> m b
।
এখন আমরা বেসিক ক্ষেত্রে যেমন একই বিভাগে ফাংশন সঙ্গে কাজ করতে চাই। আমরা এই ফাংশনগুলি রচনা করতে সক্ষম হতে চাই, আমরা চাই সংমিশ্রণটি সহযোগী হোক এবং আমরা একটি পরিচয় রাখতে চাই। আমাদের দরকার:
- একটি অপারেটর আছে করার জন্য (এটা কল দিন
<=<
যে ফাংশন composes) f :: a -> m b
এবং g :: b -> m c
কিছু মধ্যে g <=< f :: a -> m c
। এবং, এটি অবশ্যই সাহসী হতে হবে।
- প্রতিটি ধরণের জন্য কিছু পরিচয় ফাংশন রাখতে, আসুন এটি কল করুন
return
। আমরা চাই যে f <=< return
হিসাবে একই f
এবং একই return <=< f
।
কোন m :: * -> *
, যার জন্য আমরা এই ধরনের ফাংশন return
এবং <=<
একটি বলা হয় একসংখ্যা । এটি আমাদেরকে সাধারণ বিষয়গুলির মতোই সাধারণ গণনাগুলি তৈরি করতে দেয়, তবে এখন রিটার্ন মানগুলির প্রকারগুলি সুবিন্যস্ত হয় m
।
(আসলে, আমি একটু শব্দ নির্যাতিত বিভাগ এখানে। ক্যাটেগরী তত্ত্ব অর্থে আমরা আমাদের নির্মাণ একটি বিভাগ আমরা জানি পরই এই আইন আনুগত্য কল করতে পারেন।)
হাসকেলে মনড
হাস্কেল (এবং অন্যান্য কার্যকরী ভাষা) তে আমরা বেশিরভাগ মান নিয়ে কাজ করি না, ধরণের ফাংশন দিয়ে () -> a
। সুতরাং <=<
প্রতিটি monad জন্য সংজ্ঞা পরিবর্তে , আমরা একটি ফাংশন সংজ্ঞায়িত (>>=) :: m a -> (a -> m b) -> m b
। এই জাতীয় বিকল্প সংজ্ঞা সমতুল্য, আমরা >>=
ব্যবহার করে <=<
এবং বিপরীতভাবে প্রকাশ করতে পারি (অনুশীলন হিসাবে চেষ্টা করুন, বা উত্সগুলি দেখুন )। নীতিটি এখন কম স্পষ্ট, তবে এটি একই রকম রয়েছে: আমাদের ফলাফল সর্বদা প্রকারের m a
এবং আমরা প্রকারের ক্রিয়াগুলি রচনা করি a -> m b
।
আমরা তৈরি প্রতিটি মোনাডের জন্য, আমাদের অবশ্যই এটি পরীক্ষা করতে return
এবং <=<
আমাদের প্রয়োজনীয় বৈশিষ্ট্যগুলি ভুলে যাওয়া উচিত নয় : সাহচর্যতা এবং বাম / ডান পরিচয়। ব্যবহার করে প্রকাশ করা হয়েছে return
এবং এগুলিকে মনোড আইন>>=
বলা হয় ।
একটি উদাহরণ - তালিকা
যদি আমরা m
হতে বেছে নিই তবে আমরা []
এক ধরণের ক্রিয়াকলাপ পাই a -> [b]
। এই জাতীয় ফাংশনগুলি অ-বিড়ম্বনামূলক গণনার প্রতিনিধিত্ব করে, যার ফলাফল এক বা একাধিক মান হতে পারে তবে মানও নেই। এটি তথাকথিত তালিকা মোনাডকে জন্ম দেয় । এর রচনা f :: a -> [b]
এবং g :: b -> [c]
নিম্নলিখিতটির মতো কাজ করে: এর g <=< f :: a -> [c]
অর্থ হ'ল সম্ভাব্য সকল প্রকারের ফলাফল গণনা করা [b]
, g
তাদের প্রত্যেকের জন্য প্রয়োগ করা এবং সমস্ত ফলাফল একক তালিকায় সংগ্রহ করা। হাস্কেলে প্রকাশ করেছেন
return :: a -> [a]
return x = [x]
(<=<) :: (b -> [c]) -> (a -> [b]) -> (a -> [c])
g (<=<) f = concat . map g . f
বা ব্যবহার >>=
(>>=) :: [a] -> (a -> [b]) -> [b]
x >>= f = concat (map f x)
মনে রাখবেন যে এই উদাহরণে রিটার্নের ধরনগুলি [a]
তাই এটি সম্ভব ছিল যে তাদের মধ্যে কোনও ধরণের কোনও মূল্য নেই a
। প্রকৃতপক্ষে, কোনও মোনাডের জন্য এমন কোনও প্রয়োজন নেই যে রিটার্ন টাইপের এমন মান থাকতে হবে। কিছু মনদে সর্বদা থাকে (পছন্দ IO
বা State
), কিন্তু কিছু না, পছন্দ []
বা না Maybe
।
আইও মনাদ
আমি যেমন উল্লেখ করেছি, IO
মোনাড কিছুটা বিশেষ। প্রকারের মান বলতে প্রোগ্রামের পরিবেশের সাথে আলাপচারিত করে নির্মিত ধরণের মানIO a
বোঝায় । সুতরাং (অন্যান্য সমস্ত মনডের মত নয়) আমরা কিছু খাঁটি নির্মাণ ব্যবহার করে ধরণের মান বর্ণনা করতে পারি না । এখানে কেবল একটি ট্যাগ বা একটি লেবেল যা পরিবেশের সাথে যোগাযোগ করে এমন গণনাগুলি পৃথক করে। এটি (একমাত্র ক্ষেত্রে) যেখানে # 1 এবং # 2 মতামতগুলি সঠিক।a
IO a
IO
জন্য IO
একসংখ্যা:
- এর গঠন
f :: a -> IO b
এবং g :: b -> IO c
অর্থ: f
পরিবেশের সাথে ইন্টারেক্ট করে এমন গণনা এবং তারপরেg
পরিবেশের সাথে ইন্টারঅ্যাক্ট করে ফলাফলকে গণনা করে এমন মান গণনা করে comp
return
কেবলমাত্র মানটিতে IO
"ট্যাগ" যুক্ত করে (আমরা পরিবেশকে অক্ষুণ্ন রেখে ফলাফলটি কেবল "গণনা" করতে পারি)।
- সংকলক দ্বারা মোনাড আইন (সাহসীতা, পরিচয়) গ্যারান্টিযুক্ত।
কিছু নোট:
- যেহেতু মোনাডিক গণনা সবসময় ফলাফলের ধরণের থাকে
m a
তাই IO
মোনাড থেকে "পালাতে" উপায় নেই । অর্থটি হ'ল: একবার কোনও গণনা পরিবেশের সাথে যোগাযোগ করে, আপনি এটি থেকে কোনও গণনা তৈরি করতে পারবেন না যা তা নয়।
- যখন কোনও কার্যনির্বাহী প্রোগ্রামার জানেন না কীভাবে কোনও শুদ্ধ উপায়ে কীভাবে তৈরি করা যায়, (গুলি) তিনি ( শেষ অবলম্বন হিসাবে ) মোনাডের মধ্যে কিছু রাষ্ট্রীয় গণনা দ্বারা কার্যটি প্রোগ্রাম করতে পারেন
IO
। এ কারণেই IO
প্রায়শই একজন প্রোগ্রামারের পাপ বিন হিসাবে ডাকা হয় ।
- খেয়াল করুন যে অপরিষ্কার বিশ্বে (ফাংশনাল প্রোগ্রামিং অর্থে) একটি মান পড়া পরিবেশকেও বদলে দিতে পারে (যেমন ব্যবহারকারীর ইনপুট গ্রহণ করে)। এই কারণেই ফাংশনগুলির
getChar
অবশ্যই একটি ফলাফলের ধরণ থাকতে হবে IO something
।