तो यह वास्तव में मीजेर के एक पेपर का संदर्भ है और कुछ अन्य लोगों ने " केले, लेंस, लिफाफे और कांटेदार तार के साथ कार्यात्मक प्रोग्रामिंग " कहा है , मूल विचार यह है कि हम किसी भी पुनरावर्ती डेटा प्रकार ले सकते हैं, जैसे कहते हैं
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
एक अभ्यास के रूप में, आपको यह सत्यापित करना चाहिए कि यह हमारे उपरोक्त समीकरण को संतुष्ट करता है। अब हम आखिर केले (कैटामोर्फिज्म) को क्या परिभाषित कर सकते हैं!
type ListAlg a = ListF a -> a
ListAlg
s "सूची बीजगणित" के प्रकार हैं, और हम एक विशेष फ़ंक्शन को परिभाषित कर सकते हैं
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
यह वास्तव में श्रेणी सिद्धांत के एक टुकड़े से प्रेरित है जिसके बारे में मैंने लिखा था , लेकिन यह हास्केल पक्ष का मांस है।