2012-07-16 12 views
8

यहां कुल नौसिखिया, संघर्ष कर रहा है।हास्केल: मैं सेट के लिए एक प्रकार की कक्षा को कैसे परिभाषित कर सकता हूं?

मैं सेट के लिए एक प्रकार की कक्षा को परिभाषित करने की कोशिश कर रहा हूं। इस मामले के लिए इसे केवल 'अस्तित्व' की परिभाषा की आवश्यकता होगी। 'मौजूद' एक सेट आइटम पर एक सेट और फ़ंक्शन लेगा, और एक बूलियन लौटाएगा। मैं हास्केल में इसे कैसे परिभाषित कर सकता हूं?

निम्नलिखित दिशा में भी निम्नलिखित है? वर्ग के लिए बहुत अधिक मापदंडों `सेट करें:

(परिणाम - तो वहाँ प्रकार वर्ग परिभाषा और सूची के साथ सेट की एक कार्यान्वयन, 'मौजूद है' जिसके लिए अब के लिए सच रिटर्न ..

-- Set.hs -- 

class Set a b where 

    exists :: a -> (b -> Bool) -> Bool 


-- ListSet.hs -- 

instance Set ListSet a where 

    exists a f = True 

है ')

उत्तर

13

आप पर्याप्त एक्सटेंशन के साथ ऐसा कर सकते हैं। कम से कम, आपको एकाधिक-पैरामीटर प्रकार कक्षाओं की आवश्यकता होगी। हालांकि, यह उपयोग करने के लिए बहुत परेशान होगा: आपको जगह पर स्पष्ट प्रकार के हस्ताक्षर निर्दिष्ट करने की आवश्यकता होगी।

class Set a b | a -> b where 
    exists :: a -> (b -> Bool) -> Bool 

यह कहा गया है कि अगर आप सेट के प्रकार पता है, तुम तत्वों के प्रकार पता है, भी: एक तरह से इसे ठीक करने के लिए एक कार्यात्मक निर्भरता (एक और एक्सटेंशन का उपयोग कर) लागू करने के लिए है।

class Set f where 
    exists :: f a -> (a -> Bool) -> Bool 

यहाँ, प्रकार वर्ग उच्च kinded प्रकारों पर पर्वतमाला है, जो एक साफ चाल और कठिन है अगर तुम कभी नहीं किया है अपने दम पर साथ आने के लिए: हालांकि, वहाँ एक आसान तरीका है कि किसी भी एक्सटेंशन के बिना काम करता है इसे पहले देखा!

+1

बेशक, बाद वाले के लिए आवश्यक है कि तत्व प्रकार सेट प्रकार के लिए अंतिम प्रकार पैरामीटर हो - कुछ हमेशा संभव नहीं है, जैसे कि आप 'ए -> बूल' के लिए एक उदाहरण बनाना चाहते हैं। दूसरी तरफ, एसोसिएटेड प्रकार के परिवार, ठीक से हल करेंगे। – Carl

+2

धन्यवाद! मुझे दूसरा रास्ता मिल गया! मुझे यह स्वीकार करना होगा कि मुझे समझ में नहीं आता कि वहां क्या चल रहा है, लेकिन उम्मीद है कि यह मेरे लिए खुद को प्रकट करता है ... – tero

7

डैनियल वाग्नेर ने जो कुछ भी करने की कोशिश कर रहे हैं उस पर सही उत्तर दिया है। मैं बस अपनी त्रुटि के बारे में एक बिंदु जोड़ना चाहता हूं - Too many parameters for class 'Set'। इसका मतलब है कि आपने संबंधित जीएचसी एक्सटेंशन - MultiParamTypeClasses को सक्षम नहीं किया है। आप अपने स्रोत फ़ाइल के शीर्ष पर टिप्पणी की विशेष प्रकार को निर्दिष्ट करके ऐसा कर सकते हैं:

{-# LANGUAGE MultiParamTypeClasses #-} 
-- 
-- Your source code here 
-- 

तो फिर आप अपने कोड को संकलित करने में सक्षम होना चाहिए।

डैनियल के उत्तर में वर्णित एक और हास्केल सुविधा के लिए कुछ विस्तार सक्षम करने की आवश्यकता है, अर्थात् FunctionalDependencies (यह अजीब .. | a -> b .. प्रकार की कक्षा घोषणा के अंदर चीज है)। आप अल्पविराम का उपयोग कर, इस तरह एक ही समय में कई एक्सटेंशन सक्षम कर सकते हैं:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} 

कार्ल टिप्पणी एक और विस्तार, TypeFamilies है, जो भी आप सेट प्रकार या अन्य के जेनेरिक वर्ग ऐसा करने के लिए (कोशिश कर रहे हैं के लिए साधन प्रदान कर सकता का उल्लेख है संग्रह की तरह)। आप इसके बारे में यहां पढ़ सकते हैं: http://www.haskell.org/haskellwiki/Type_families

+0

मैं इसे कार्यात्मक निर्भरता विधि के साथ भी करने में कामयाब रहा। हालांकि, मुझे 'फ्लेक्सिबल इंस्टेंस' एक्सटेंशन भी शामिल करना पड़ा। – tero

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

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