कार्यात्मक प्रोग्रामिंग में केले का विभाजन और संलयन क्या है?


22

मेरे विश्वविद्यालय के पाठ्यक्रम में इन शर्तों का उल्लेख किया गया है। क्विक गुग्लिंग ने मुझे कुछ विश्वविद्यालय के कागजात की ओर इशारा किया, लेकिन मैं एक सरल स्पष्टीकरण की तलाश कर रहा हूं।


@jozefg: आपकी पोस्ट के लिंक के लिए धन्यवाद। इसके बारे में एक सवाल। वाक्य में "इस अर्थ में एक बीजगणित एक वस्तु सी की एक जोड़ी है, और एक नक्शा एफसी → सी।", क्या सी वास्तव में एक वस्तु है, या बल्कि एक श्रेणी माना जाता है? दूसरे शब्दों में, मुझे यकीन नहीं है कि अगर F किसी श्रेणी में एक फ़नकार को दर्शाता है, और F-algebras, उस फ़नकार से प्रेरित बीजगणित हैं, यदि F स्वयं पर किसी ऑब्जेक्ट से एक विशेष तीर है।
गियोर्जियो

Cकिसी श्रेणी में एक वस्तु है ( मान लें CC), Fएक ऐसा फ़न्नेकार है CC -> CCजिससे यह CCअपने आप में वापस मैप करता है। अब F CC -> CCश्रेणी में केवल एक सामान्य तीर है CC। तो एक Fबीजगणित एक वस्तु C : CCऔर एक तीर F C -> CहैCC
डैनियल ग्रैज़र

जवाबों:


4

हालांकि 2 उत्तर पहले ही प्रदान किए जा चुके हैं, मुझे नहीं लगता कि "केले के विभाजन" को अभी तक यहाँ समझाया गया है।

यह वास्तव में "कार्यात्मक प्रोग्रामिंग के साथ केले, लेंस, लिफाफे और कांटेदार तार, एरिक मीजर मैर्टन फॉकिंगा, रॉस पैटरसन, 1991" में परिभाषित किया गया है; यह लेख स्क्विगोल के भारी उपयोग के कारण (मेरे लिए) पढ़ना कठिन है। हालांकि, "एक सार्वभौमिकता और गुना की अभिव्यक्ति, ग्राहम हटन, 1999" पर एक परिभाषा है जिसमें परिभाषा को समझना आसान है:

Tuples को उत्पन्न करने के लिए गुना के उपयोग का एक पहला पहला उदाहरण , फ़ंक्शन समलम्बन पर विचार करें जो संख्याओं की सूची के योग और लंबाई की गणना करता है :

sumlength :: [Int] → (Int,Int)
sumlength xs = (sum xs, length xs)

पहले दिए गए गुना का उपयोग करते हुए फ़ंक्शन योग और लंबाई की परिभाषाओं का सीधा संयोजन करके , फ़ंक्शन समनोट्रिक्स को गुना के एकल अनुप्रयोग के रूप में पुनर्परिभाषित किया जा सकता है जो संख्याओं की एक सूची से कुछ संख्या उत्पन्न करता है:

sumlength = fold (λn (x, y) → (n + x, 1 + y)) (0, 0)

यह परिभाषा मूल परिभाषा की तुलना में अधिक कुशल है, क्योंकि यह केवल दो अलग-अलग ट्रैवर्सल्स के बजाय तर्क सूची पर एक एकल ट्रावेल बनाती है। इस उदाहरण से सामान्य रूप से, एक ही सूची में गुना के आवेदनों की किसी भी जोड़ी को हमेशा गुना के एक भी आवेदन को देने के लिए जोड़ा जा सकता है , जो एक जोड़ी उत्पन्न करता है, जो तथाकथित 'केले विभाजन' की संपत्ति को गुना (मेइजर, 1992) से अपील करता है। । इस संपत्ति का अजीब नाम इस तथ्य से निकला है कि कभी-कभी तह संचालक कोष्ठक (| |) का उपयोग करके लिखा जाता है जो केले जैसा दिखता है, और युग्मन संचालक को कभी-कभी विभाजन कहा जाता है। इसलिए, उनके संयोजन को केले का विभाजन कहा जा सकता है!


19

तो यह वास्तव में मीजेर के एक पेपर का संदर्भ है और कुछ अन्य लोगों ने " केले, लेंस, लिफाफे और कांटेदार तार के साथ कार्यात्मक प्रोग्रामिंग " कहा है , मूल विचार यह है कि हम किसी भी पुनरावर्ती डेटा प्रकार ले सकते हैं, जैसे कहते हैं

 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

ListAlgs "सूची बीजगणित" के प्रकार हैं, और हम एक विशेष फ़ंक्शन को परिभाषित कर सकते हैं

  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

यह वास्तव में श्रेणी सिद्धांत के एक टुकड़े से प्रेरित है जिसके बारे में मैंने लिखा था , लेकिन यह हास्केल पक्ष का मांस है।


2
क्या यह ध्यान देने योग्य है कि केले (| |) कोष्ठक हैं जो मूल कागज का उपयोग काटा
jk

7

हालाँकि जोज़फ़ग ने एक उत्तर दिया है, मुझे यकीन नहीं है कि यह प्रश्न का उत्तर है। "फ्यूजन कानून" को निम्नलिखित पेपर में समझाया गया है:

गुना की सार्वभौमिकता और स्पष्टता पर एक ट्यूटोरियल, ग्राहम हटन, 1999

मूल रूप से यह कहता है कि कुछ शर्तों के तहत आप एक फ़ंक्शन की संरचना ("फ्यूज") को जोड़ सकते हैं और एक ही गुना में मोड़ सकते हैं, इसलिए मूल रूप से

h · गुना gw = fold fv

इस समानता के लिए शर्तें हैं

hw = v
h (gxy) = fx (हाई)

"केला स्प्लिट" या "केला स्प्लिट लॉ" लेख से है

केले, लेंस, लिफ़ाफ़े और कांटेदार तार के साथ कार्यात्मक प्रोग्रामिंग, एरिक मीजेर मैर्टन फॉकिंगा, रॉस पैटरसन, 1991

दुर्भाग्य से लेख को समझना बहुत कठिन है क्योंकि यह बर्ड-मर्टेंस की औपचारिकता का उपयोग करता है, इसलिए मैं इसका सिर या पूंछ नहीं बना सका। जहां तक ​​मुझे समझ में आया कि "केला विभाजन कानून" में कहा गया है कि यदि आपके पास एक ही तर्क पर चलने वाले 2 तह हैं, तो उन्हें एक ही तह में विलय किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.