haskell - हास्केल ट्यूपल कंस्ट्रक्टर(जीएचसी) और एक भाषा और इसके कार्यान्वयन के बीच अलगाव



functional-programming tuples (1)

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

data (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p q r s t u v w x y z a_ b_ c_ d_ e_ f_ g_ h_ i_ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ a__ b__ c__ d__ e__ f__ g__ h__ i__ j__
  = (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p q r s t u v w x y z a_ b_ c_ d_ e_ f_ g_ h_ i_ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ a__ b__ c__ d__ e__ f__ g__ h__ i__ j__

... हाँ।

तो, क्या यह संभव होगा कि ऑपरेटर / फ़ंक्शंस के इस परिवार को हैक्सेल कार्यान्वयन के भीतर से ही, कुछ भी प्रकार की प्रणाली और मौजूदा भाषा सुविधाओं (घोषणाओं, प्रकार के हस्ताक्षर, फ़ंक्शन परिभाषा आदि) का उपयोग करके परिभाषित किया जाए? और यदि हां, तो कैसे? या यह असंभव है और आपको इस संग्रह के कार्यों के समर्थन फ्रेमवर्क को खोजने के लिए संकलक की ओर देखना होगा?

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

यह भी मामला है कि टुपल सिंटैक्स अंतर्निहित है और ऐसा कुछ नहीं है जिसकी नकल की जा सकती है, लेकिन यह एक अलग मुद्दा है। आप इस प्रकार की कल्पना कर सकते हैं:

data Tuple2 a b = Tuple2 a b
data Tuple3 a b c = Tuple3 a b c

... आदि।, जो विशेष वाक्य रचना का उपयोग नहीं करते हैं, लेकिन फिर भी उपरोक्त कारणों के लिए उदारतापूर्वक परिभाषित नहीं किया जा सकता है।

यह एक और भी सामान्य प्रश्न की ओर जाता है: हास्केल द्वारा खुद को कितना प्रकार का समर्थन किया जाता है, प्रकार और फ़ंक्शन परिभाषाओं, घोषणाओं आदि के माध्यम से; और कंपाइलर / कार्यान्वयन द्वारा कितना समर्थित है? (मुझे पता है कि जीएचसी हास्केल में लिखा गया था, इस सवाल का जवाब नहीं है)

लगभग सभी इसे हास्केल में परिभाषित किया गया है। कुछ चीजों में विशेष सिंटैक्स होता है जिसकी आप नकल नहीं कर सकते हैं, लेकिन ज्यादातर मामलों में केवल कुछ परिभाषाओं पर विशेष ध्यान देने वाले कंपाइलर का विस्तार होता है। अन्यथा, इसमें कोई अंतर नहीं है:

data [] a = [] | a : [a]

... और कोई भी समान प्रकार आप खुद को परिभाषित करते हैं।

यही है, यदि आप मानक पुस्तकालयों (प्रस्तावना सहित) को त्यागने और कच्चे हास्केल में जमीन से सब कुछ करने के लिए थे; क्या जीएचसी की सभी विशेषताओं के पूर्ण कार्यान्वयन का निर्माण संभव होगा, केवल उस न्यूनतम सेट का उपयोग करके? हास्केल का उपयोग करते हुए एक हैस्केल कार्यान्वयन बनाने के लिए आपको भाषा की विशेषताओं का सबसे उपयुक्त सेट क्या चाहिए? क्या मैं प्रस्तावना का परित्याग कर सकूंगा और फिर इसे जीएचसी के भीतर से मैन्युअल रूप से फिर से तैयार करूंगा? यदि आप प्रस्तावना को छोड़ देते हैं और कभी कुछ आयात नहीं करते हैं, तो आपके साथ काम करने के लिए क्या बचा है?

आपको GHC के NoImplicitPrelude और RebindableSyntax एक्सटेंशन के बारे में पढ़ने के लिए ज्ञानवर्धक लग सकता है, जो आपको, अन्य बातों के अलावा, व्याख्या do लिए उपयोग की जाने वाली परिभाषाओं को बदल देता है, कैसे संख्यात्मक शाब्दिकों को संभाला जाता है, if then else सिंटैक्स क्या करता है, आदि।

यह कहना पर्याप्त है कि बहुत, बहुत कम को फिर से लागू नहीं किया जा सकता है। ज्यादातर चीजें जो केवल सिंटैक्स के कारण विशेष नहीं हैं, और उन्हें सामान के साथ प्रतिस्थापित किया जा सकता है (जैसे सूचियां और टुपल्स, ऊपर)।

अंत में उन चीजों का एक सीमित सेट होता है जिनमें बहुत विशेष व्यवहार होता है - IO प्रकार एक स्पष्ट उदाहरण है - कि आप बिल्कुल भी प्रतिस्थापित नहीं कर सकते, क्योंकि वे रनटाइम सिस्टम में किसी चीज़ में सीधे झुके होते हैं जो आप कर सकते हैं ' टी की जगह।

हास्केल ने मेरे दिमाग को फिर से उड़ा दिया जब मुझे एहसास हुआ कि

(x,y)

के लिए सिंटैक्टिक शुगर है

(,) x y

स्वाभाविक रूप से मैं इसे बड़े ट्यूपल्स तक विस्तारित करना चाहता था। परंतु

(,) x ((,) y z)

मुझे दिया

(x,(y,z))

जो मुझे नहीं लग रहा था। फुसफुसाहट पर, मैंने कोशिश की

(,,) x y z

और यह काम किया, जो मैं चाहता था:

(x,y,z)

इसने सवाल उठाया: आप इसे कितनी दूर ले जा सकते हैं? मेरे विस्मय की बहुत सीमा थी, कोई सीमा नहीं थी। नीचे दिए गए सभी वैध ऑपरेटर हैं:

(,)
(,,)
(,,,)
(,,,,)
--etc
(,,,,,,,,,,,,,,)
(,,,,,,,,,,,,,,,)
--etc
(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
--etc

यह व्यवहार अद्भुत है और मेरे वास्तविक प्रश्न की ओर ले जाता है: क्या यह ऐसा कुछ है जिसे मेरे स्वयं के कार्यों में अनुकरण किया जा सकता है? या यह टपल ऑपरेटर की सिर्फ एक जीएचसी-विशिष्ट विशेषता है? मुझे लगता है कि यह बाद की बात है जैसा कि मैंने haskell98 विनिर्देश पढ़ा है और iirc यह कहता है कि कार्यान्वयन में केवल 15 आइटम तक टपल ऑपरेटर को परिभाषित करना है। जबकि जीएचसी पूरे हॉग पर चला गया है और आपको इसे मनमानी सीमा तक करने देता है।

तो, क्या यह संभव होगा कि ऑपरेटर / फ़ंक्शंस के इस परिवार को हैक्सेल कार्यान्वयन के भीतर से ही, कुछ भी प्रकार की प्रणाली और मौजूदा भाषा सुविधाओं (घोषणाओं, प्रकार के हस्ताक्षर, फ़ंक्शन परिभाषा आदि) का उपयोग करके परिभाषित किया जाए? और यदि हां, तो कैसे? या यह असंभव है और आपको इस संग्रह के कार्यों के समर्थन फ्रेमवर्क को खोजने के लिए संकलक की ओर देखना होगा?

यह एक और भी सामान्य प्रश्न की ओर जाता है: हास्केल द्वारा खुद को कितना प्रकार का समर्थन किया जाता है, प्रकार और फ़ंक्शन परिभाषाओं, घोषणाओं आदि के माध्यम से; और कंपाइलर / कार्यान्वयन द्वारा कितना समर्थित है? (मुझे पता है कि जीएचसी हास्केल में लिखा गया था, इस सवाल का जवाब नहीं है)

यही है, यदि आप मानक पुस्तकालयों (प्रस्तावना सहित) को त्यागने और कच्चे हास्केल में जमीन से सब कुछ करने के लिए थे; क्या जीएचसी की सभी विशेषताओं के पूर्ण कार्यान्वयन का निर्माण संभव होगा, केवल उस न्यूनतम सेट का उपयोग करके? हास्केल का उपयोग करते हुए एक हैस्केल कार्यान्वयन बनाने के लिए आपको भाषा की विशेषताओं का सबसे उपयुक्त सेट क्या चाहिए? क्या मैं प्रस्तावना का परित्याग कर सकूंगा और फिर इसे जीएचसी के भीतर से मैन्युअल रूप से फिर से तैयार करूंगा? यदि आप प्रस्तावना को छोड़ देते हैं और कभी कुछ आयात नहीं करते हैं, तो आपके साथ काम करने के लिए क्या बचा है?

ऐसा लग सकता है कि मैं एक लाख सवाल पूछ रहा हूं, लेकिन वे सभी वास्तव में एक ही बात को अलग-अलग शब्दों के साथ पूछने की कोशिश कर रहे हैं। यह तुम्हारा सबसे अच्छा शॉट तो दे!





comma