हास्केल फंक्शनलर्स के पास केवल उनकी लक्षित श्रेणी के प्रकार क्यों हैं?


12

हास्केल में, फन्नेकार टाइपकास्ट फनकार को निम्नानुसार परिभाषित किया गया है (उदाहरण के लिए हास्केल विकी देखें )

class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b 

जहां तक ​​मैं समझता हूं (कृपया मुझे गलत होने पर सही करें), ऐसे फ़नकार के पास केवल लक्षित श्रेणी हो सकती है , जैसे कि एक प्रकार के कंस्ट्रक्टर का उपयोग करके निर्मित श्रेणी, उदाहरण []के लिए Maybe, आदि। दूसरी तरफ, किसी भी श्रेणी वाले फंक्शंस के बारे में सोच सकता है एक फ़नकार के लक्ष्य के रूप में, जैसे सभी हास्केल प्रकारों की श्रेणी। उदाहरण के लिए, Intफ़नकार की लक्षित श्रेणी में एक वस्तु हो सकती है, न कि केवल Maybe Intया [Int]

हास्केल फंक्शनलर्स पर इस प्रतिबंध के लिए क्या प्रेरणा है?


4
सादगी? हास्केल में प्रथम श्रेणी प्रकार के कार्य नहीं होते हैं, इसलिए सभी कार्य वास्तव में केवल प्रकार के निर्माता होते हैं।
डैनियल ग्रैज़र 30

2
@jozefg: मेरी अज्ञानता को क्षमा करें: "प्रथम श्रेणी के प्रकार्य" क्या हैं?
जियोर्जियो

4
तो उस फ़ंक्शन में हम एक fदाईं ओर घूम रहे हैं ? और आपके परिदृश्य में, fएक सामान्य हास्केल फ़ंक्शन और मानचित्र प्रकारों के प्रकार की तरह होना चाहिए। हास्केल में, केवल उन चीजों को अनुमति दी जाती है जो कि प्रकार * -> *हैं। टाइप परिवार अधिक सामान्य हैं, लेकिन उन्हें हमेशा पूरी तरह से लागू किया जाना चाहिए
डैनियल ग्रैज़र


@jozefg: मैं कभी-कभी इस सवाल के बारे में बार-बार सोचता हूं। मुझे लगता है कि हास्केल प्रतिबंध फंक्शनलर्स की अभिव्यंजक शक्ति को प्रभावित नहीं करता है। उदाहरण के लिए, मान लें कि हमारे पास एक फ़ंक्टर है जो लिस्ट फ़ंफ़र के लिए आइसोमोर्फिक है, लेकिन मैप नहीं है, कहते हैं, Int -> [Int] लेकिन Int -> <फैंसी प्रकार का उपयोग करते हुए कोई प्रकार नहीं। तब मुझे लगता है कि कोई भी साबित कर सकता है कि <फैंसी प्रकार का उपयोग कर कोई निर्माता नहीं है> isomorphic से [Int]। तो एक प्रकार के निर्माणकर्ता का उपयोग करके परिभाषित की गई वस्तुओं को चुनना सिर्फ सुविधाजनक है और यह अभिव्यंजक शक्ति का त्याग नहीं करता है।
जियोर्जियो

जवाबों:


1

वहाँ कोई प्रतिबंध नहीं है! जब मैंने टाइप कंस्ट्रक्टर्स के लिए श्रेणी-सिद्धांतात्मक आधार सीखना शुरू किया, तो इस बिंदु ने मुझे भी भ्रमित कर दिया। हम उस तक पहुँचेंगे। लेकिन पहले, मैं कुछ भ्रम को साफ कर दूं। ये दो उद्धरण:

ऐसे फ़नकार के पास केवल लक्ष्य श्रेणी ही हो सकती है जो एक प्रकार के कंस्ट्रक्टर का उपयोग करके निर्मित श्रेणी है

तथा

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

यह दिखाएं कि आप गलतफहमी कर रहे हैं कि एक फ़नकार क्या है (या बहुत कम से कम, आप शब्दावली का दुरुपयोग कर रहे हैं)।

फ़नकार श्रेणियों का निर्माण नहीं करते हैं । श्रेणियों के बीच एक फ़नकार एक मानचित्रण है । लक्ष्य श्रेणी में ऑब्जेक्ट और मॉर्फिज्म के लिए फ़ॉन्टर ऑब्जेक्ट और मॉर्फिज़्म (प्रकार और फ़ंक्शन) को स्रोत श्रेणी में लाते हैं।

ध्यान दें कि इसका मतलब है कि एक फ़नकार वास्तव में मैपिंग की एक जोड़ी है: ऑब्जेक्ट 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


आपके उत्तर के लिए धन्यवाद, यह प्रश्न दो साल से अधिक पुराना है। "फ़नकार श्रेणियों का निर्माण नहीं करते हैं।": मैंने ऐसा नहीं कहा। मैंने कहा कि फंक्शनलर्स दो श्रेणियों को मैप करते हैं, जहां लक्ष्य श्रेणी में फॉर्म होना चाहिए f a, जहां fतक मुझे पता है, एक प्रकार का कंस्ट्रक्टर है। श्रेणी सिद्धांत से मुझे जो याद है, उसमें से किसी प्रकार का विहित प्रतिनिधित्व होना चाहिए (श्रेणियों की श्रेणी में प्रारंभिक वस्तु; शायद मैं शब्दावली का दुरुपयोग कर रहा हूं।) वैसे भी, मैं आपके उत्तर को ध्यान से पढ़ूंगा। बहुत धन्यवाद।
जियोर्जियो

@ जियोर्जियो वूप्स, मैंने ध्यान नहीं दिया कि यह कितना पुराना था। यह सिर्फ "अनुत्तरित प्रश्नों" में दिखा। मुझे यकीन नहीं है कि आप "विहित प्रतिनिधित्व" से क्या मतलब है। जहां तक ​​मुझे पता है (और मैं यहां गलत हो सकता है), फंक्शनलर्स और शुरुआती / टर्मिनल ऑब्जेक्ट्स के बीच कोई संबंध नहीं है।
बागबानी

मेरा यह मतलब है: en.wikipedia.org/wiki/Initial_algebra (कंप्यूटर विज्ञान में उपयोग देखें)। हास्केल (अधिकांश) प्रकारांतरक में बीजीय डेटा प्रकारों को परिभाषित किया गया है। ऐसे फ़नकार का लक्ष्य ऑब्जेक्ट एक प्रारंभिक बीजगणित है। प्रारंभिक बीजगणित मूल्य निर्माणकर्ताओं का उपयोग करके निर्मित शब्दों के सेट के लिए आइसोमॉर्फिक है। जैसे, सूचियों के लिए, []और :। मेरा मतलब विहित प्रतिनिधित्व से है।
जियोर्जियो

हाँ, मुझे पता है कि एक प्रारंभिक वस्तु क्या है, और यह कि आगमनात्मक डेटाटाइप्स किसी श्रेणी के एफ-बीजगणित में प्रारंभिक वस्तुएं हैं। आप सही कह रहे हैं कि कई प्रकार के निर्माणकर्ताओं को एकरूपता से परिभाषित किया गया है। लेकिन यह कड़ाई से आवश्यक नहीं है। उदाहरण के लिए, जो फ़न्क्टर उत्पाद प्रकार और एक फ़ंक्शन के लिए (_, int)एक प्रकार लेता है वह आगमनात्मक नहीं है। a(a, int)f : 'a -> 'bg : 'a * int -> 'a * int
बागीचा

क्या आपका मतलब है: "लेता है ... एक समारोह के f : 'a -> 'bलिए g : 'a * int -> 'b * int?
जियोर्जियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.