সুতরাং এটি আসলে মাইজার এবং " কলা, লেন্স, খাম এবং কাঁটাতারের সাথে ফাংশনাল প্রোগ্রামিং " নামে পরিচিত কয়েকজনের একটি গবেষণাপত্রের মূল উল্লেখ, মূল ধারণাটি হ'ল আমরা যে কোনও পুনরাবৃত্ত তথ্য টাইপ নিতে পারি, যেমন বলা যায়
data List = Cons Int List | Nil
এবং আমরা একটি ধরণের পরিবর্তনশীল মধ্যে পুনরাবৃত্তি ফ্যাক্টর করতে পারেন
data ListF a = Cons Int a | Nil
কেন আমি যুক্ত করেছি F
কারণ এটি এখন একটি ফান্টেক্টর! এটি আমাদের তালিকাগুলি নকল করতে দেয় তবে একটি মোড় দিয়ে: তালিকা তৈরি করতে আমাদের তালিকার ধরণটি বাসাতে হয়
type ThreeList = ListF (ListF (ListF Void)))
আমাদের মূল তালিকা পুনরুদ্ধার করার জন্য আমরা এই পাখির রাখা প্রয়োজন অসীম । এটি আমাদের একটি টাইপ দেয় ListFF
যেখানে
ListF ListFF == ListFF
এটি করার জন্য একটি "নির্দিষ্ট পয়েন্ট টাইপ" সংজ্ঞায়িত করুন
data Fix f = Fix {unfix :: f (Fix f)}
type ListFF = Fix ListF
অনুশীলন হিসাবে, আপনার এটি আমাদের উপরের সমীকরণটিকে সন্তুষ্ট করে যাচাই করা উচিত ow
type ListAlg a = ListF a -> a
ListAlg
গুলি হল "তালিকার বীজগণিত" প্রকার, এবং আমরা একটি নির্দিষ্ট ফাংশন সংজ্ঞায়িত করতে পারি
cata :: ListAlg a -> ListFF -> a
cata f = f . fmap (cata f) . unfix
আরও
cata :: ListAlg a -> ListFF -> a
cata :: (Either () (Int, a) -> a) -> ListFF -> a
cata :: (() -> a) -> ((Int, a) -> a) -> ListFF -> a
cata :: a -> (Int -> a -> a) -> ListFF -> a
cata :: (Int -> a -> a) -> a -> [Int] -> a
চেনা চেনা? cata
ঠিক ডান ভাঁজ হিসাবে একই!
সত্যিই মজার বিষয় হ'ল আমরা কেবল তালিকার তালিকাগুলির চেয়ে বেশি এটি করতে পারি, যে কোনও ধরণের এই " cata
ফান্টারের স্থির বিন্দু" দিয়ে সংজ্ঞায়িত একটি রয়েছে এবং সেগুলি সংযুক্ত করার জন্য আমাদের কেবলমাত্র স্বাক্ষরের শিথিল করতে হবে
cata :: (f a -> a) -> Fix f -> a
এটি আসলে বিভাগের থিয়োরির একটি অংশ থেকে অনুপ্রাণিত হয়েছিল যা আমি লিখেছিলাম , তবে এটি হ্যাস্কেল পক্ষের মাংস।