वहाँ कोई प्रतिबंध नहीं है! जब मैंने टाइप कंस्ट्रक्टर्स के लिए श्रेणी-सिद्धांतात्मक आधार सीखना शुरू किया, तो इस बिंदु ने मुझे भी भ्रमित कर दिया। हम उस तक पहुँचेंगे। लेकिन पहले, मैं कुछ भ्रम को साफ कर दूं। ये दो उद्धरण:
ऐसे फ़नकार के पास केवल लक्ष्य श्रेणी ही हो सकती है जो एक प्रकार के कंस्ट्रक्टर का उपयोग करके निर्मित श्रेणी है
तथा
फ़ंक्शंस के किसी भी वर्ग को फ़नकार के लक्ष्य के रूप में सोच सकते हैं, जैसे सभी हास्केल प्रकारों की श्रेणी
यह दिखाएं कि आप गलतफहमी कर रहे हैं कि एक फ़नकार क्या है (या बहुत कम से कम, आप शब्दावली का दुरुपयोग कर रहे हैं)।
फ़नकार श्रेणियों का निर्माण नहीं करते हैं । श्रेणियों के बीच एक फ़नकार एक मानचित्रण है । लक्ष्य श्रेणी में ऑब्जेक्ट और मॉर्फिज्म के लिए फ़ॉन्टर ऑब्जेक्ट और मॉर्फिज़्म (प्रकार और फ़ंक्शन) को स्रोत श्रेणी में लाते हैं।
ध्यान दें कि इसका मतलब है कि एक फ़नकार वास्तव में मैपिंग की एक जोड़ी है: ऑब्जेक्ट F_obj पर मैपिंग और आकृति विज्ञान F_morph पर मैपिंग । हास्केल में, फ़न्क्टर का ऑब्जेक्ट भाग F_obj टाइप कंस्ट्रक्टर (उदा List
) का नाम है , जबकि मॉर्फिज़्म भाग फंक्शन है fmap
(यह हास्केल कंपाइलर पर छांटने के लिए है जिसे fmap
हम किसी भी अभिव्यक्ति में संदर्भित कर रहे हैं)। इस प्रकार, हम यह नहीं कह सकते हैं कि List
एक फ़नकार है; केवल एक संयोजन है List
और fmap
एक फनकार है। फिर भी, लोग नोटेशन का दुरुपयोग करते हैं; प्रोग्रामर List
एक फ़नकार को बुलाते हैं , जबकि श्रेणी सिद्धांतकार फ़नकार के दोनों हिस्सों को संदर्भित करने के लिए एक ही प्रतीक का उपयोग करते हैं।
इसके अलावा, प्रोग्रामिंग में, लगभग सभी फंक्शंस एंडोफुन्क्टर हैं , अर्थात , स्रोत और लक्ष्य श्रेणी समान हैं - हमारी भाषा में सभी प्रकार की श्रेणी। इस श्रेणी के प्रकार कहते हैं । टाइप पर एक एंडोफंक्टर एफ एक टाइप टी को दूसरे प्रकार के एफटी और एक फ़ंक्शन टी -> एस से दूसरे फ़ंक्शन एफटी -> एफएस के लिए मैप करता है । यह मानचित्रण निश्चित रूप से फ़नकारक कानूनों का पालन करता है।
List
एक उदाहरण के रूप में उपयोग करना : हमारे पास एक प्रकार का कंस्ट्रक्टर है List : Type -> Type
, और एक फ़ंक्शन है fmap: (a -> b) -> (List a -> List b)
, जो एक साथ एक फ़नकार बनाते हैं। टी
स्पष्ट करने के लिए एक अंतिम बिंदु है। लेखन पूर्णांक की नई प्रकार की सूची List int
नहीं बनाता है। यह प्रकार पहले से मौजूद था । यह हमारी श्रेणी के प्रकार में एक वस्तु थी । List Int
बस इसे संदर्भित करने का एक तरीका है।
अब, आप सोच रहे हैं कि एक फ़नकार एक प्रकार का नक्शा, कहने, Int
या करने के लिए मैप क्यों नहीं कर सकता है String
। लेकिन, यह कर सकते हैं! बस एक पहचान फ़नकार का उपयोग करना है। किसी भी श्रेणी C के लिए , पहचान फ़नकार हर वस्तु को स्वयं और मॉर्फिज़्म को स्वयं मैप करता है। यह सत्यापित करने के लिए सरल है कि यह मानचित्रण फ़नकार कानूनों को संतुष्ट करता है। हास्केल में, यह एक प्रकार का कंस्ट्रक्टर होगा id : * -> *
जो हर प्रकार के नक्शे को खुद बनाता है। उदाहरण के लिए, का id int
मूल्यांकन करता है int
।
इसके अलावा, कोई निरंतर फ़ंक्शनल भी बना सकता है , जो सभी प्रकारों को एक ही प्रकार से मैप करता है। उदाहरण के लिए, फ़न्क्टर ToInt : * -> *
, जहाँ ToInt a = int
सभी प्रकारों के लिए a
, और सभी आकारिकी से पूर्णांक पहचान फ़ंक्शन को मैप करता है: fmap f = \x -> x