2009-09-25 21 views
19

उच्च रैंक प्रकार बहुत मजेदार लगते हैं। Haskell wikibook से इस उदाहरण आता है:हास्केल में उच्च रैंक प्रकारों के लिए आपको क्या उपयोग मिलते हैं?

foo :: (forall a. a -> a) -> (Char,Bool) 
foo f = (f 'c', f True) 

अब हम संकलक बिना फटे foo id मूल्यांकन कर सकते हैं। इस उदाहरण को वास्तविक दुनिया के उदाहरण द्वारा तुरंत देखा गया है, मैंने कुछ अन्य स्थानों में देखा है: एसटी मोनड और runST। यह बहुत मजेदार है।

लेकिन मैं अभी तक एक स्थिति है जहाँ मैं उच्च रैंक के एक तर्क के साथ अपने ही समारोह लिख कर एक समस्या का समाधान भर में आना होगा। क्या तुम? जंगली में रैंक -2 या रैंक-एन पॉलिमॉर्फिज्म के आपके उदाहरण क्या हैं?

उत्तर

7

Darcs source में withRepoLock जैसे कार्यों पर एक नजर डालें।

Darcs कई भंडार स्वरूपों के लिए समर्थन है, और वह समर्थन एक typeclass के माध्यम से व्यक्त किया जाता है। तो आप कोड लिख सकते हैं जो भंडार प्रारूपों पर सामान्य है। जब वास्तव में ऑन-डिस्क रिपॉजिटरी पढ़ते हैं तो आप उस कोड को कुछ सामान्य कोड के माध्यम से प्रेषित करना चाहते हैं जो यह बताता है कि भंडार किस प्रारूप में है और सही टाइपक्लास तत्काल चुनता है।

3

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

उच्च रैंक प्रकार का लाभ यह है संकलक करने के लिए प्रोग्रामर से यह अधिकार प्राप्त करने के लिए जिम्मेदारी हस्तांतरित कर देता है। पारंपरिक दृष्टिकोण के साथ, यदि एक डार्क्स डेवलपर ने भंडार प्रकार के साथ गलती की है तो परिणाम या तो रन-टाइम त्रुटि या अन्य दूषित डेटा होगा। उच्च रैंक प्रकार के साथ डेवलपर संकलन समय पर एक प्रकार त्रुटि प्राप्त करता है।

8

वीरिच और वॉशबर्न के "बॉक्स जाने केले"! (paper, slides)

यहाँ क्या यह सब के बारे में है की एक बहुत ही कच्चे तेल और शायद थोड़ा गलत व्याख्या है: दिए गए एक आगमनात्मक प्रकार, बीजीबी आप उस प्रकार से कार्य की अंतरिक्ष में जो कर रहे हैं "सकारात्मक" प्रस्तुत कर सकते हैं - वे कभी नहीं उनके तर्कों पर मामले-भेदभाव। अधिकतर वे अन्य तर्कों (आमतौर पर उसी प्रकार के) के हिस्से के रूप में अपने तर्क शामिल करते हैं।

वीरिच + वॉशबर्न इसका उपयोग संभवतः adequate-XRankNTypes में लैम्ब्डा कैलकुस का HOAS प्रतिनिधित्व है (क्या कोई इसे अभी तक पर्याप्त साबित कर चुका है?)। एक

(forall g . GArrow g => g x y) 

यह काम करता है में एक

(forall g . GArrow g => g() x -> g() y) 

चालू करने के लिए, क्योंकि रैंक -2 बहुरूपी प्रकार संरचना नहीं "का निरीक्षण" कर सकते हैं:

मैं इसे here (गन्दा कोड चेतावनी) का उपयोग इसके तर्क के - यह सब कुछ कर सकता है कि बड़े संरचनाओं में तर्क "पेस्ट" है।कुछ चालबाजी मुझे यह पता लगाने देती है कि पेस्टिंग कहां होती है, और फिर मैं पेस्टिंग पॉइंट (यदि कोई हो) GArrow के इनपुट पर वापस थ्रेड करता हूं।

आप Control.Arrow कक्षा के साथ ऐसा नहीं कर सकते हैं, क्योंकि पूरे हास्केल फ़ंक्शन स्पेस arr के माध्यम से इसमें "लीक" करता है।