সবার আগে:
যে কোনও মোনাড হ'ল একটি আবেদনকারী ফান্টেক্টর এবং কোনও প্রয়োগকারী ফান্টেক্টর একটি ফান্টেক্টর।
এটি হাস্কেলের প্রসঙ্গে সত্য, তবে ( Applicative
"স্ট্রং ল্যাক্স মোনয়েডাল ফান্টেক্টর" হিসাবে পড়া ) সাধারণভাবে নয়, বরং তুচ্ছ কারণেই আপনি বিভিন্ন মনোডিয়াল বিভাগগুলির মধ্যে "প্রয়োগমূলক" ফান্টার রাখতে পারেন, যেখানে মনড (এবং কমোনাদ) এন্ডোফান্টর রয়েছে ।
Applicative
তদ্ব্যতীত, দৃ la় শিথিল মনোঅডিয়াল ফান্ট্যাক্টরগুলির সাথে সনাক্তকরণ কিছুটা বিভ্রান্তিকর, কারণ নামটি ন্যায়সঙ্গত করার জন্য (এবং প্রকারের স্বাক্ষরটি (<*>)
) বদ্ধ মনোঅডিয়াল বিভাগগুলির মধ্যে একটি ফান্টারের প্রয়োজন যা একচেটিয়া কাঠামো এবং অভ্যন্তরীণ হোম উভয় সংরক্ষণ করে । এই -এর সম্ভাব্য বলা যেতে পারে একটি "শিথিল monoidal functor বন্ধ", যে ব্যতীত monoidal বদ্ধ শ্রেণীর মধ্যে একটি functor যে সংরক্ষণ পারেন সম্পত্তি সংরক্ষণ অন্যান্য সুস্পষ্ট পথ । কারণ Applicative
শুধুমাত্র endofunctors বর্ণনা Hask এর monoidal গঠন সংরক্ষণের (,)
, তার দৃষ্টান্ত স্বয়ংক্রিয়ভাবে বৈশিষ্ট্য অনেক লাভ, তাদের সহ শক্তি , যা এইভাবে লুপ্ত করা যেতে পারে।
এর সাথে আপাত সংযোগটি তাত্ক্ষণিকভাবে তাদের স্বতন্ত্র স্তরের কাঠামোর দিকগুলির সাথে মিলিত হওয়ার Monad
অন্তর্নিহিত সীমাবদ্ধতার একটি নিদর্শন, এটি Applicative
একটি খুশির কাকতালীয় ঘটনা যা দুর্ভাগ্যবশত দ্বৈতকরণ থেকে যায় না।
একটি বিভাগ একটি comonad ঠিক যেমন একটি একসংখ্যা হয় সি ণ পি , একটি oplax monoidal functor সি → ডি একটি শিথিল monoidal functor হয় সি ণ পি → ডি ণ পি । কিন্তু এইচ একটি গুলি ট ণ পি monoidal নয় বন্ধ , এবং একটি সহ- যে না ফাংশন আবেদন কমই যথার্থতা নাম অন্তর্ভুক্ত। যাইহোক, ফলাফল মারাত্মক আকর্ষণীয় হবে না:CCop C→DCop→DopHaskopApplicative
class (Functor f) => CoMonoidal f where
counit :: f () -> ()
cozip :: f (a, b) -> (f a, f b)
এর পরিবর্তে আমরা "কোলাক্স ক্লোজড ফান্টেক্টর" ধারণাটি কল্পনা করতে পারি, Applicative
এটি যদি বিদ্যমান থাকে তবে আরও অনেক বেশি দেখতে হবে। দুর্ভাগ্যবশত, এ সব একটি বদ্ধ বিভাগ (আমার জানা মতে) নয়: মধ্যে এইচ একটি গুলি ট morphisms সাথে সঙ্গতিপূর্ণ খ → একটি মধ্যে এইচ একটি গুলি ট ণ পি কিন্তু একটি হিসাবে কাজ করে না সেখানে অভ্যন্তরীণ Hom - কারণ তীর সহ-ফাংশন কিছু বাছাই পরিবর্তে প্রয়োজন হবে, যা আমরা জন্য সাধারণভাবে সংজ্ঞায়িত করতে পারবে না বিপরীত হয় এইচ একটি গুলি ট ।Haskopnewtype Op b a = Op (a -> b)
Haskb→aHaskopOp b a
Hask
কেবলমাত্র আমরা যে "colax বদ্ধ functors" সাজা যদি অস্তিত্ত্বকে , এবং উপরন্তু আমরা যেভাবে naively আশা চাই তারা would, একটি সহ- কাজ সম্ভবত ভালো দেখাবে যে উপর ভিত্তি করে:HaskApplicative
class (Functor f) => CoApplicative f where
copure :: f a -> a
coap :: (f a -> f b) -> f (a -> b)
যোগ duplicate :: f a -> f (f a)
করার copure
ফলে একটি কমোনাদ তৈরি করা হবে (অবশ্যই আইনগুলি সন্তুষ্ট বলে ধরে নেওয়া হবে)। তবে coap
- এবং যাই হোক না কেন - এর মধ্যে সুস্পষ্ট সম্পর্ক নেই extend :: (f a -> b) -> f a -> f b
। প্রকারগুলির সাথে তুলনা করলে এটি স্পষ্ট হয়ে ওঠে যে দ্বৈতকরণ বিভিন্নভাবে ঘটছে: কমোনয়েডাল কাঠামোগুলি অন্তর্নিহিত duplicate
এবং cozip
একে অপরের সাথে বা এর সাথে coap
(যা সম্ভবত কোনওভাবেই বোঝায় না) এর সাথে সামান্য সম্পর্ক রয়েছে , liftA2 (,)
এবং (<*>)
সমান এবং এর থেকে প্রাপ্ত হতে পারে join
।
দ্বৈতকরণের আর একটি সম্ভাব্য উপায় Applicative
, যার কমোনাদগুলির সাথে আরও কম সম্পর্ক রয়েছে, তা হ'ল বিপরীতমুখী মনোয়েডাল ফ্যান্টেক্টর বিবেচনা করা:
class (Contravariant f) => ContraMonoidal f where
contraunit :: f a
contrazip :: f a -> f b -> f (Either a b)
তবে এটি উপরের মত একই বিষয়গুলির অনেকগুলি উপরে চলে, যথা কোনও বদ্ধ শ্রেণির নয়। যদি এটি হয় তবে আমাদের এমন কিছু টাইপ থাকত যা আমরা যেমন ফাংশন লিখতে পারি এবং এর মতোই বাস্তবে প্রত্যাশিতভাবে কাজ করে।Haskopb <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
HaskCoApplicative
তবে, দ্বৈতকরণের জন্য আরও অতিথিপরায়ণ এককথায় বদ্ধ ক্যাটাগরিতে আপনার ভাগ্য ভাল হতে পারে। বিশেষত, আমি বিশ্বাস করি Kleisli (Cont r)
এবং এর বিপরীত উভয় বিভাগই একঘেয়ে বন্ধ রয়েছে তাই এই ধারণাগুলি অন্বেষণ করার জন্য এটি আরও ভাল প্রসঙ্গ হতে পারে।