2013-02-07 14 views
13

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

data Something = Something Integer deriving (MyClass, Show) 

class MyClass a where 
    hello :: MyClass a => a -> a 

instance MyClass Integer where 
    hello i = i + 1 

main = print . hello $ Something 3 

है, लेकिन MyClass व्युत्पत्ति नहीं है। क्यूं कर?

+6

आपको 'हैलो' के लिए प्रकार हस्ताक्षर के 'MyClass a =>' भाग की आवश्यकता नहीं है; यह इस तथ्य से निहित है कि 'ए' को 'क्लास माईक्लास' के वर्ग की घोषणा के माध्यम से दायरे में लाया गया है ...'। –

+0

[GHC उपयोगकर्ता मार्गदर्शिका प्राप्त करने के बारे में मार्गदर्शिका] पर एक नज़र डालें [https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extensions-to-the-deriving-mechanism)। –

उत्तर

13

जीएचसी जादुई रूप से मनमानी डेटा प्रकारों के उदाहरणों को प्राप्त नहीं कर सकता है। हालांकि, यह इस तथ्य का उपयोग कर सकता है कि newtype घोषणा GeneralizedNewtypeDeriving एक्सटेंशन का उपयोग करने वाले लोगों के उदाहरणों को प्राप्त करने के लिए समान अंतर्निहित प्रकार के लिए एक नया नाम बनाती है। इसलिए, जब आप कुछ इस तरह कर सकता है:

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 

newtype Something = Something Integer deriving (MyClass, Show) 

class MyClass a where 
    hello :: MyClass a => a -> a 

instance MyClass Integer where 
    hello i = i + 1 

main = print . hello $ Something 3 

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

+2

'newtype' व्युत्पन्न विश्वसनीय है लेकिन इसके वर्तमान कार्यान्वयन से सुरक्षित नहीं है। मैं केवल आपके कोड के शुरुआती संस्करणों में उपयोग करता हूं। नया 'डिफ़ॉल्ट'/सामान्य ढांचा अधिक सामान्य और सुरक्षित (लेकिन क्लंकियर) है, इसलिए जब संभव हो तो इसका उपयोग करें। –

+0

@ फिलिपजेएफ यह जानना अच्छा है। – sabauma

+0

@ फिलिपजेएफ न्यूटाइप प्राप्त करने के वर्तमान कार्यान्वयन के बारे में असुरक्षित क्या है? –

13

आप GHC documentation on Generic Programming पर एक नज़र डालना चाहते हैं।
आपको ऐसी कक्षा बनाने की आवश्यकता है जो मनमाने ढंग से प्रकार के सामान्य प्रतिनिधित्व पर काम कर सके। मुझे नहीं लगता कि आपके द्वारा दिया गया विशिष्ट उदाहरण व्युत्पन्न वर्ग के लिए उचित है।

+2

+1 खुशी हुई किसी ने इस प्रश्न के जवाब के रूप में इसे लाया। क्या आप एक ऐसे उदाहरण में exapanding कल्पना करते हैं जहां यह _is_ उचित है? – AndrewC

+0

@AndrewC दुर्भाग्यवश मैं इसे अब तक विस्तारित करने के लिए पर्याप्त रूप से समझ नहीं पा रहा हूं। यदि आप प्रश्न को संपादित करने के लिए स्वतंत्र महसूस करते हैं। – asm

+0

यहां एक सामान्य "डिफ़ॉल्ट" वर्ग का एक उदाहरण है (एक प्रकार का पहला निर्माण इसके लिए डिफ़ॉल्ट है): http://pastebin.com/amgQRvFD (मैं सामान्य प्रोग्रामिंग सीख रहा हूं, मुझे नहीं पता कि यह सबसे अच्छा है या नहीं मार्ग) –

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