2010-02-12 11 views
11

क्या कक्षाओं में बाधाओं को लागू करने के लिए कोई तरीका है (कोई रास्ता)?क्या हास्केल के प्रकार वर्गों में बाधाओं को लागू करने का कोई तरीका है?

मैं जो बात कर रहा हूं उसके उदाहरण के रूप में, मान लीजिए कि मैं एक समूह को एक प्रकार के वर्ग के रूप में कार्यान्वित करना चाहता हूं।

class Group a where 
    product :: a -> a -> a 
    inverse :: a -> a 
    identity :: a 

लेकिन उन किसी भी काम करता है नहीं कर रहे हैं, लेकिन वे कुछ बाधाओं से संबंधित होना चाहिए: तो एक प्रकार का एक समूह है, तो वहाँ तीन कार्य हैं होगा। उदाहरण के लिए:

product a identity = a 
product a (inverse a) = identity 
inverse identity = identity 

आदि ...

वहाँ वर्ग की परिभाषा में बाधा इस तरह लागू करने के लिए इतना है कि किसी भी घटना स्वचालित रूप से इसे वारिस होगा कोई तरीका है? - वास्तव में, सी 2 के साथ ही संभव समूह है

data C2 = E | C 

instance Group C2 where 
     identity = E 
     inverse C = C 

यह दो परिभाषा विशिष्ट निर्धारित करता है सी 2 (बाधाओं से ऊपर सभी संभव आपरेशनों को परिभाषित: एक उदाहरण के रूप में, मैं सी 2 समूह, द्वारा परिभाषित लागू करना चाहते हैं मान लें कि बाधाओं के कारण दो तत्व)। क्या यह काम करने का कोई तरीका है?

+2

(एर, 'उलटा सी = सी', निश्चित रूप से?) – dave4420

+0

हाँ, –

+0

पर ध्यान देने के लिए धन्यवाद उन बाधाओं को आमतौर पर * कानून * उदाहरण, मोनाड कानून कहा जाता है। – mb14

उत्तर

11

क्या इस तरह की बाधा को लागू करने का कोई तरीका है?

संबहुत सारे लोगों के इसके लिए पूछ किया गया है, शानदार टोनी होरे सहित, लेकिन कुछ भी अभी तक क्षितिज पर दिखाई देता है।

यह समस्या Haskell Prime समूह के लिए चर्चा का एक उत्कृष्ट विषय होगा। अगर किसी ने एक अच्छा प्रस्ताव जारी किया है, तो शायद वहां पाया जा सकता है।

पीएस यह एक महत्वपूर्ण समस्या है!

+1

मेरे पास दृढ़ विश्वास है कि ऐसी बाधाओं की संतुष्टि के लिए संकलन-समय की जांच रोकना-बराबर है। क्या आप इस मामले पर कुछ प्रकाश डाल सकते हैं? – fishlips

+1

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

+0

हमम ... यह सुनकर दुखी है। क्या कोई अन्य भाषा है जो इस प्रकार की बाधा जांच कर सकती है? एक समस्या जिसे मैं हल करना चाहता हूं वह एक ऐसा प्रोग्राम बनाना है जो इस मामले में कुछ बीजगणितीय बाधाओं को देखते हुए सभी संभावित उदाहरणों को पाता है (यानी, सभी संभावित आदेश एन समूह खोजें)। मैंने सुना है कि प्रोलॉग ऐसा कुछ कर सकता है, लेकिन मेरे पास एक कार्यात्मक भाषा होगी। –

5

प्रकार कक्षाओं में परिभाषाएं और घोषणाएं हो सकती हैं। उदाहरण:

class Equality a where 
    (?=), (!=) :: a -> a -> Bool 

    a ?= b = not (a != b) 
    a != b = not (a ?= b) 

instance Eq a => Equality a where 
    (?=) = (==) 

test = (1 != 2) 

आप यह भी निर्दिष्ट विशेष की कमी सादा हास्केल में (उन्हें कानूनों कॉल) कर सकते हैं, लेकिन यह गारंटी है कि संकलक उनका उपयोग नहीं करेगा नहीं है। एक आम उदाहरण monadic laws

8

कुछ मामलों में आप QuickCheck का उपयोग कर गुण निर्दिष्ट कर सकते हैं। यह वास्तव में प्रवर्तन नहीं है, लेकिन यह आपको सामान्य परीक्षण प्रदान करने देता है कि सभी उदाहरण पास होना चाहिए। Eq के साथ उदाहरण के लिए आप कह सकते हैं:

prop_EqNeq x y = (x == y) == not (x != y) 

बेशक यह उदाहरण लेखक इस परीक्षण कॉल करने के लिए अप करने के लिए अभी भी है।

मोनैड कानूनों के लिए ऐसा करना दिलचस्प होगा।

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

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