एक व्यावहारिक दृष्टिकोण से, आप "functors" OCaml और हास्केल के रूप में असंबंधित में सोच सकते हैं। जैसा कि आपने कहा था, हास्केल में एक मज़ेदार कोई भी प्रकार है जो आपको उस पर एक फ़ंक्शन को मैप करने की अनुमति देता है। ओकैमल में, एक मज़ेदार एक मॉड्यूल द्वारा मॉड्यूल parametrized है।
In Functional Programming, what is a functor? में दो भाषाओं में कौन से फ़ैक्टर हैं और भिन्न हैं, इसका एक अच्छा विवरण है।
हालांकि, जैसा कि नाम का तात्पर्य है, वास्तव में दो अलग-अलग अवधारणाओं के बीच एक कनेक्शन है! दोनों भाषा के फंक्शंस श्रेणी सिद्धांत से अवधारणा के सिर्फ अहसास हैं।
श्रेणी सिद्धांत श्रेणियों का अध्ययन है, जो उनके बीच "morphisms" के साथ वस्तुओं के मनमानी संग्रह हैं। एक श्रेणी का विचार बहुत अमूर्त है, इसलिए "ऑब्जेक्ट्स" और "मॉर्फिज्म" वास्तव में कुछ प्रतिबंधों के साथ कुछ भी हो सकते हैं-प्रत्येक ऑब्जेक्ट और मॉर्फिज़्म के लिए एक पहचान रूपरेखा होनी चाहिए।
श्रेणी का सबसे स्पष्ट उदाहरण सेट और फ़ंक्शंस की श्रेणी है: सेट ऑब्जेक्ट्स और कार्यों को मॉर्फिज़्म सेट करने के बीच होते हैं। जाहिर है, प्रत्येक सेट में एक पहचान समारोह है और कार्यों को बनाया जा सकता है। हास्केल या ओकैमल जैसे कार्यात्मक प्रोग्रामिंग भाषा को देखकर एक बहुत ही समान श्रेणी बनाई जा सकती है: कंक्रीट प्रकार (उदा। *
के साथ प्रकार) वस्तुएं हैं और हास्केल/ओकैमल फ़ंक्शन उनके बीच मोर्फ़ हैं।
श्रेणी सिद्धांत में, एक मिक्सर श्रेणियों के बीच एक परिवर्तन है। यह श्रेणियों के बीच एक समारोह की तरह है। जब हम हास्केल प्रकारों की श्रेणी को देख रहे हैं, तो एक फ़ैक्टर अनिवार्य रूप से एक प्रकार-स्तरीय फ़ंक्शन होता है: यह किसी अन्य चीज़ के लिए मानचित्र प्रकार करता है। विशेष प्रकार का मज़ेदार हम मानचित्र प्रकारों के बारे में अन्य प्रकारों पर ध्यान देते हैं। इसका एक आदर्श उदाहरण Maybe
: Maybe
मानचित्र Int
से Maybe Int
, String
से Maybe String
और इसी तरह के लिए है। यह प्रत्येक संभव हैस्केल प्रकार के लिए मैपिंग प्रदान करता है।
फ़ैक्टरों की एक अतिरिक्त आवश्यकता है-उन्हें श्रेणी के रूपों के साथ-साथ वस्तुओं को मानचित्र बनाना होगा।विशेष रूप से, अगर हमारे पास A → B
और हमारे मज़ेदार मानचित्र A
से A'
और B
से B'
पर हैं, तो इसे कुछ मॉर्फिज्म A' → B'
पर मॉर्फिज्म A → B
को मानचित्र बनाना होगा। एक ठोस उदाहरण के रूप में, मान लें कि हमारे पास Int
और String
प्रकार हैं। हास्केल फ़ंक्शन Int → String
का पूरा समूह है। Maybe
के लिए उचित फ़ैक्टर होने के लिए, इनमें से प्रत्येक के लिए Maybe Int → Maybe String
फ़ंक्शन होना चाहिए।
खुशी से, यह fmap
फ़ंक्शन करता है-यह मानचित्र कार्य करता है। Maybe
के लिए, इसमें (a → b) → Maybe a → Maybe b
है; हम प्राप्त करने के लिए कुछ कोष्ठक जोड़ सकते हैं: (a → b) → (Maybe a → Maybe b)
। इस प्रकार के हस्ताक्षर से हमें क्या पता चलता है कि हमारे पास किसी भी सामान्य कार्य के लिए, हमारे पास Maybe
से अधिक संबंधित कार्य भी है।
तो एक मज़ेदार उन प्रकारों के बीच मैपिंग है जो उनके बीच के कार्यों को भी संरक्षित करता है। fmap
फ़ंक्शन अनिवार्य रूप से केवल फ़ैक्टर पर इस दूसरे प्रतिबंध का सबूत है। इससे यह देखना आसान हो जाता है कि हास्केल Functor
कक्षा गणितीय अवधारणा का एक विशेष संस्करण है।
तो ओकैमल के बारे में क्या? ओकैमल में, एक मज़ेदार एक प्रकार नहीं है-यह मॉड्यूल है। विशेष रूप से, यह एक parametrized मॉड्यूल है: एक मॉड्यूल जो एक तर्क के रूप में एक और मॉड्यूल लेता है। पहले से ही, हम कुछ समांतर देख सकते हैं: हास्केल में, Functor
एक प्रकार-स्तरीय फ़ंक्शन की तरह है; ओकैमल में, एक मज़ेदार मॉड्यूल -level फ़ंक्शन जैसा है। तो वास्तव में, यह वही गणितीय विचार है; हालांकि, प्रकार पर उपयोग किए जाने के बजाय-हास्केल में-इसका उपयोग मॉड्यूल पर किया जाता है।
वहाँ OCaml functors के लिए सीएस साइट पर श्रेणी सिद्धांत functors संबंधित के तरीके के बारे में कहीं अधिक विवरण दिया गया है: What is the relation between functors in SML and Category theory?। प्रश्न OCaml प्रति से की बजाय एसएमएल के बारे में बात करता है, लेकिन मेरी समझ यह है कि ओकैमल का मॉड्यूल सिस्टम एसएमएल से बहुत निकटता से संबंधित है।
संक्षेप में: हास्केल और ओकैमल में मज़दूर दो मूलभूत रूप से अलग संरचनाएं हैं जो दोनों एक ही बहुत ही सार गणितीय विचारों के सुधार होते हैं। मुझे लगता है कि यह बहुत साफ है :)।
फ्रैंकली, (1) मुझे यकीन नहीं है कि श्रेणी सिद्धांत के बारे में बात करने से वास्तव में अधिकांश शुरुआती लोगों को यह समझने में मदद मिलती है कि हास्केल मज़ेदार क्या है। यह शायद भाषा डिजाइन में अधिक उन्नत पूछताछ के लिए आरक्षित होना चाहिए। (2) एमएल मजेदार और श्रेणी सिद्धांतों के बीच संबंध काफी ज्यादा बकवास है। यह किसी चीज का एक रेट्रो-स्पष्टीकरण है जिसने शायद "फ़ंक्शन" जैसा दिखने वाला नाम चुना है, और विशेष रूप से विश्वास नहीं करता है और न ही एमएल फ़ैक्टर के साथ काम करने में सहायक होता है। आप बस "मॉड्यूल के बीच कार्य" कह सकते हैं और हर किसी को परेशानी बचा सकते हैं। – gasche
@gasche: (1) मेरे लिए, जब मैं उनके पीछे श्रेणी सिद्धांत के बारे में पढ़ता हूं तो केवल मज़दूरों को वास्तव में समझ में आता है। इससे पहले वे बहुत मनमानी लग रहे थे। सबकुछ परिप्रेक्ष्य में डालकर कुछ अच्छा ट्यूटोरियल था, लेकिन दुर्भाग्य से मैंने इसका लिंक खो दिया है। मैं वास्तव में चाहता हूं कि मुझे पहले उस ट्यूटोरियल मिले। (2) एमएल डिजाइन किए जाने के बारे में मुझे बहुत कुछ पता नहीं है, लेकिन ऐसा लगता है कि यह काफी अच्छा है। महत्वपूर्ण हिस्सा हैस्केल विचार और एमएल विचार के बीच समानताएं देखना है। –
समस्या यह है कि हास्केल और एमएल विचार के बीच कोई उचित समानांतर नहीं है, केवल नामकरण टकराव है। – gasche