2013-04-12 9 views
15

मैं dependently टाइप प्रोग्रामिंग पर एक पत्र पढ़ रहे हैं और निम्नलिखित उद्धरण में आए हूँ:एक्सटेंसिबल हास्केल प्रकार कक्षा

"[...] हास्केल के प्रकार कक्षाओं के विपरीत, डेटा प्रकार [...] है बंद ", इस अर्थ में कि कोई भी डेटा प्रकार को विस्तार किए बिना ब्रह्मांड में नए प्रकार नहीं जोड़ सकता है।

मेरा नौसिखिया प्रश्न यह है: हस्केल प्रकार के वर्ग खुले क्या हैं? वे कैसे विस्तारित हैं? इसके अलावा, इस संपत्ति (खुले बनाम बंद) होने के प्रकार-सैद्धांतिक परिणाम क्या हैं?

धन्यवाद!

उत्तर

9

की तरह एक प्रकार वर्ग को देखते हुए:

data Monoid m = Monoid 
    { mempty :: m 
    , mappend :: m -> m -> m 
    } 

उदाहरण की तरह:

instance Monoid [a] where 
    mempty = [] 
    mappend = (++) 
(मूल रूप से) एक शब्दकोश प्रकार के रूप में हुड के तहत कार्यान्वित

class Monoid m where 
    mempty :: m 
    mappend :: m -> m -> m 

... यह है

... शब्दकोश में अनुवाद प्राप्त करें:

listIsAMonoid :: Monoid [a] 
listIsAMonoid = Monoid 
    { mempty = [] 
    , mappend = (++) 
    } 

... और जब भी आप Monoid एस के रूप में अपनी क्षमता में सूचियों का उपयोग करते हैं तो संकलक ऊपर संकलित करता है।

यह हमें लाता है अपने प्रश्नों के:

क्या अर्थ में हास्केल प्रकार कक्षाएं खुले हैं? वे कैसे विस्तारित हैं?

वे उसी अर्थ में खुले हैं कि पॉलिमॉर्फिक मान खुले हैं। हम कुछ बहुरूपी डेटा प्रकार है:

data Monoid m = ... 

... और हम किसी भी प्रकार जहाँ हम mempty और mappend क्षेत्रों के लिए उपयुक्त मान प्रदान कर सकते करने के लिए बहुरूपी m प्रकार चर का दृष्टांत कर सकते हैं।

+0

टाइप-क्लास-ए-डिक्शनरी व्याख्या बल्कि ghc-specific है। हैकेल स्पेक में कुछ भी नहीं है जिसके लिए इसकी आवश्यकता है, और अन्य कार्यान्वयन (उदा। जेएचसी) एक अलग दृष्टिकोण का उपयोग करते हैं। –

+0

@ जॉनल यह अभी भी एक उपयोगी मानसिक उपकरण है जिसकी समझ में यह पॉलिमॉर्फिक है। –

12

प्रकार कक्षाएं खुली हैं, क्योंकि आप मनमाने ढंग से इसका उदाहरण बना सकते हैं। जब आप टाइप क्लास बनाते हैं तो आप इंटरफेस निर्दिष्ट करते हैं, लेकिन इसके प्रकार के प्रकार नहीं। फिर किसी भी कोड में जिसमें टाइपक्लास परिभाषा शामिल है, आप instance TypeClass type of सिंटैक्स का उपयोग करके इंटरफ़ेस से आवश्यक फ़ंक्शंस प्रदान करने के अपने प्रकार का उदाहरण बना सकते हैं।

+1

उत्तर के लिए धन्यवाद। मेरे पास पहले इंटरफ़ेस/कार्यान्वयन अंतर्ज्ञान था। मेरा सवाल इस बात के बारे में था कि बाद में टाइप क्लास द्वारा दिए गए इंटरफ़ेस का विस्तार किया जा सकता है या नहीं, यानी प्रारंभिक दायरे के बाहर उस डेटा प्रकार के लिए एक और कन्स्ट्रक्टर परिभाषित करके? – AnaK

+0

आप केवल नए प्रकार के वर्ग को परिभाषित करके इंटरफ़ेस का विस्तार कर सकते हैं, हालांकि विरासत की धारणा है जो आपको इसे विस्तारित करने की अनुमति देती है। आप 'कक्षा (इंटरफेस बेहतर इंटरफेस) => बेहतर इंटरफेस प्रकार का उपयोग कर सकते हैं ... '। तुलना करें कि 'मोनैड' को 'फंक्टर' के विस्तार के रूप में कैसे कार्यान्वित किया जा सकता है। – Adrian

+0

ठीक है, मैं समझता हूँ। मैं ** खुले ** डेटा प्रकारों के साथ और अधिक सोच रहा था जैसे कि उनके रचनाकार बिखरे हुए दिखाई दे सकते हैं, जबकि अर्थात् अभिनय कर रहे हैं जैसे कि वे बंद थे (एक स्थान पर परिभाषित)। – AnaK

2

राल्फ लाममेल के बारे में कुछ बहुत अच्छा video lectures on Channel9 है - अत्यधिक अनुशंसित।

+0

संदर्भ के लिए धन्यवाद! मैं अभिव्यक्ति की समस्या से अनजान था। – AnaK

3

टाइप क्लास "खुले" हैं क्योंकि वे अधिक उदाहरण घोषणाओं को जोड़कर "तथ्य के बाद" उन्हें हमेशा अधिक प्रकार जोड़ सकते हैं। यह "क्लाइंट" कोड में भी किया जा सकता है कि केवल टाइप श्रेणी वाले मॉड्यूल का उपयोग करता है।

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

हास्केल में कंक्रीट डेटा प्रकार "बंद" हैं, ऐसा नहीं हो सकता है। अगर मैं कोड लिखता हूं जो सदस्यों पर एक विशिष्ट डेटा प्रकार (यहां तक ​​कि यदि यह पॉलिमॉर्फिक है) भी चलाता है, तो उस तरह का कोई तरीका नहीं है जिससे आप उस कोड का उपयोग नई प्रकार की चीज़ों पर संचालित करने के लिए कर सकें, जिसे मैंने नहीं सोचा था जब तक कि आप इस प्रकार को संशोधित नहीं कर लेते (जिसके बाद संभवतः उन सभी स्थानों को संशोधित करने की आवश्यकता होती है जहां इसका उपयोग किया जाता है)।

संबंधित मुद्दे