मैं कुछ डिफ़ॉल्ट विधियों के साथ Type Class
को कार्यान्वित करना चाहता हूं, लेकिन मुझे एक त्रुटि मिल रही है, कि मैं type classes
परिभाषाओं के अंदर record selectors
का उपयोग नहीं कर सकता।हास्केल के प्रकार वर्गों में रिकॉर्ड चयनकर्ता
निम्नलिखित कोड मूल रूप से बनाता है type class
जो add
समारोह है, जो कुछ data type
की repr
रिकॉर्ड करने के लिए एक तत्व जोड़ना चाहिए परिभाषित करता है।
import qualified Data.Graph.Inductive as DG
class Graph gr a b where
empty :: DG.Gr a b
empty = DG.empty
repr :: gr -> DG.Gr a b
-- following function declaration does NOT work:
add :: a -> gr -> gr
add el g = g{repr = DG.insNode el $ repr g}
संकलक फेंकता त्रुटि:: यहाँ कोड है
repr is not a record selector
In the expression: g {repr = DG.insNode el $ repr g}
In an equation for add:
add el g = g {repr = DG.insNode el $ repr g}
यह हास्केल में ऐसे तरीकों घोषित करने के लिए संभव है?
स्पष्टीकरण
मैं ऐसे डिजाइन की जरूरत है क्योंकि मैं कुछ data types
, जो समान तरह से व्यवहार मिल गया है। आइए कहें, हमें A
, B
और C
data types
मिला। उनमें से प्रत्येक को repr :: DG.Gr a b
रिकॉर्ड होना चाहिए, जहां a
और b
A
, B
और C
प्रत्येक के लिए अलग हैं।
A
, B
और C
add
या delete
(जो मूल रूप से जोड़ सकते हैं या repr
रिकॉर्ड करने के लिए तत्वों हटाना) की तरह ही काम करता है, को साझा करें। यदि ये डेटा प्रकार बहुत सारे फ़ंक्शंस साझा करते हैं तो type class
में फ़ंक्शंस को कार्यान्वित करने और type class
के उदाहरण बनाने के लिए यह समझ में आता है - ये फ़ंक्शन स्वचालित रूप से हमारे प्रत्येक data type
के लिए लागू किए जाएंगे।
अतिरिक्त मैं data types
में से कुछ को प्यार करूंगा (मान लें कि मैं B
चाहता हूं) add
पर कॉल करते समय थोड़ा अलग व्यवहार करने के लिए। B
के लिए type class
के instance
बनाते समय इस व्यवहार को कार्यान्वित करना आसान है।
जवाब है "नहीं", लेकिन "लेंस का उपयोग करके,", लेकिन अधिक महत्वपूर्ण बात यह है कि मुझे लगता है कि यहां कहीं भी कक्षाएं क्या हैं, इसकी मूलभूत गलतफहमी है। यदि आपने कहा कि आप ऐसा वर्ग चाहते हैं तो यह बहुत मदद करेगा; हम एक और बेवकूफ विकल्प का सुझाव देने में सक्षम हो सकते हैं। –
@DanielWagner - मैंने जिस समस्या को हल करने की कोशिश कर रहा हूं, उसके लिए मैंने एक स्पष्टीकरण जोड़ा है - मुझे आशा है कि अब यह स्पष्ट हो गया है, मैं ऐसा क्यों करने की कोशिश कर रहा हूं :) –
मेरा अद्यतन उत्तर देखें। दूसरे उदाहरण में मैं 'अद्यतन' विधि का उपयोग करता हूं जो वास्तविक अद्यतन करता है (उदाहरणों में उस रिकॉर्ड अद्यतन वाक्यविन्यास का उपयोग करके कार्यान्वित किया जा सकता है), और तीसरा उदाहरण 'Control.Lens' का उपयोग करता है। – JJJ