इस तरह की कटौती करते समय "लर्न यू हास्केल" में क्या धारणा है?


18

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

से आप एक हास्केल जानें , निम्नलिखित पैरा तीसरा और अंतिम एक युक्त "हम यह मान है *"।

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

और अब हम इसे एक उदाहरण बनाना चाहते हैं FunctorFunctorप्रकार के प्रकार चाहता है, * -> *लेकिन Barryऐसा नहीं लगता है कि यह उस तरह का है। किस तरह का है Barry? ठीक है, हम देखते हैं कि यह तीन प्रकार के पैरामीटर लेता है, इसलिए यह होने जा रहा है something -> something -> something -> *। यह कहना सुरक्षित है कि pयह एक ठोस प्रकार है और इस तरह का एक प्रकार है *इसके लिए k, हम मानते हैं *और इसलिए विस्तार से, tएक तरह का है* -> * । अब हम उन प्रकारों को प्रतिस्थापित करते हैं somethingजिन्हें हमने प्लेसहोल्डर के रूप में उपयोग किया है और हम देखते हैं कि यह एक प्रकार का है (* -> *) -> * -> * -> *

हम कुछ भी क्यों मान रहे हैं? "हम मान लेते हैं कि X (यानी हम मान लेते हैं कि X सत्य है)" मेरे लिए यह सोचना स्वाभाविक है कि हमें इस मामले पर भी विचार करना चाहिए कि X गलत है। उदाहरण के विशिष्ट मामले में, नहीं कर सकता है tएक तरह से हो सकता है (* -> *) -> *और kएक तरह से (* -> *)? यदि ऐसा होता, तो जो कुछ भी tऔर kवास्तव में था, t kवह अभी भी एक ठोस प्रकार होगा, नहीं?

मैं देखता हूं कि तर्क की पूरी लाइन को कंपाइलर के खिलाफ जांचा जाता है, लेकिन मुझे नहीं लगता कि कंपाइलर मानता है । यदि ऐसा होता है, तो मैं जानना चाहूंगा कि क्या है, अगर यह नहीं है तो फिर से मुझे डर है कि मैं अनुच्छेद का अर्थ याद कर रहा हूं।


4
तुम सही हो। वास्तव में, हम k :: Lकिसी भी प्रकार के लिए हो सकते हैं L, जब तक t :: L -> *। हालांकि एक कंपाइलर को कुछ विशिष्ट का चयन करना चाहिए L, या एक पॉलीकॉल का सहारा लेना चाहिए। एक बहु-जीवन विकल्प सबसे सामान्य विकल्प होगा, लेकिन यहां जीएचसी चुनता है L = *(मूल हास्केल में पॉलीकाइंड नहीं होते हैं, उन्हें विस्तार के रूप में चालू करना पड़ता है)। चूंकि यह कुछ चुनता है जो मनमाना है, LYAH शब्द "ग्रहण" (AFAICT) का उपयोग करता है।
ची

1
ठीक है, हो सकता है कि संकलक मान लें कि हम कम से कम हम पर विश्वास करते हैं , या बिल्कुल नहीं।
एनरिको मारिया डे एंजेलिस

जवाबों:


19

वास्तव में, संकलक मान लेता है! लेकिन आप इसे PolyKinds एक्सटेंशन के साथ नहीं पूछ सकते हैं। आप इसके बारे में अधिक विस्तार से यहां पढ़ सकते हैं । उस विस्तार को चालू करने के साथ, जिस तरह का Barryहोगा forall k. (k -> *) -> k -> * -> *


-1

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

दोनों t, kऔर pप्रकार चर हैं। जैसा कि हम देखते yabba :: pहैं कि यह अकेले रह सकता है इसलिए यह एक स्थिर फ़ंक्शन की तरह है, जैसे कि यह एक प्रकार के बजाय एक मूल्य था, यह टाइप सिग्नेचर कहेंगे Intया Char, जो भी ... आप इसे नाम देते हैं। लेकिन चूंकि यह एक प्रकार है तो यह एक तरह से हस्ताक्षर है *

हालाँकि tयहाँ टाइप kकरने के लिए टाइप वेरिएबल टाइप होता है ( dabba :: t k) इसलिए हमें यकीन है कि (यहाँ कोई धारणा नहीं है) tएक तरह का हस्ताक्षर है * -> *और kहै*

एक बार जब हम यह जान लेते हैं ... Barry t k pप्रकार का हस्ताक्षर है (* -> *) -> * -> * -> *जिसका अर्थ है कि यह tतब kऔर फिर लेता है pऔर हमें Barryप्रकार देता है।

संपादित करें नीचे दिए गए @ luqui की टिप्पणी पढ़ना सुनिश्चित करें।


7
k*जब आप दावा करते हैं कि यह दावा करने के लिए विवश नहीं है t। हम कर सकते हैं k :: * -> *और t :: (* -> *) -> *उदाहरण के लिए। doo :: k Intरिकॉर्ड में एक फ़ील्ड जोड़ें और यह बिना किसी समस्या के पास हो जाएगा।
लुक्विी

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