आप OverloadedRecordFields
जो अभी भी लागू किया जा रहा है में रुचि होगी।
वर्तमान कार्यान्वयन जानबूझकर अपंग है, ताकि एक ही समय में बहुत अधिक नई चीजें पेश न करें। रिकार्ड प्रोजेक्शन प्रकारों को शामिल करना वर्म्स का एक बुरा कैन खोलने के लिए निकलता है (जो उपरोक्त विस्तार पते)।
निम्नलिखित GHCi बातचीत
ghci> data Record1 = Record1 { field :: Int }
ghci> data Record2 = Record2 { field :: Bool }
ghci> :t field
पर विचार करें क्या field
के प्रकार अब क्या होना चाहिए? किसी भी तरह, हमें "नामक फ़ील्ड वाले किसी भी रिकॉर्ड "की धारणा को पकड़ने के लिए एक तरीका चाहिए।
class HasField (x :: k) r a | x r -> a where
getField :: r -> a
एक HasField x r a
बाधा तथ्य यह है कि x
अपनेपन की प्रकार a
एक क्षेत्र है प्रतिनिधित्व करता है: यह अंत करने, OverloadedRecordFields
एक नया निर्मित प्रकार वर्ग
नया मॉड्यूल GHC.Records
को परिभाषित करता है निम्नलिखित का परिचय रिकॉर्ड प्रकार r
पर। getField
विधि रिकॉर्ड चयनकर्ता फ़ंक्शन देता है।
फिर, ऊपर दिए गए हमारे उदाहरण से, ऐसा लगता है कि जीएचसी द्वारा निम्नलिखित उदाहरणों को जादुई रूप से उत्पन्न किया गया था (वास्तव में यह वास्तव में नहीं होगा कि यह क्या होगा, लेकिन यह एक अच्छा पहला अनुमान है)।
instance HasField "field" Record1 Int where
getField (Record1 f) = f
instance HasField "field" Record2 Bool where
getField (Record2 f) = f
यदि आप रुचि रखते हैं, तो मैं प्रस्ताव पढ़ने की अनुशंसा करता हूं। मैंने जिस अन्य विशेषता का उल्लेख नहीं किया है वह IsLabel
वर्ग है। एक बार जब यह सब लागू किया गया है (और रिकॉर्ड को अपडेट के लिए कुछ और) मैं (इसलिए मैं एक अंडरस्कोर से शुरू करने और makeLenses
के लिए TemplateHaskell
सक्रिय करने के फ़ील्ड नामों की घोषणा को रोक सकता है) get my lenses for free करने में सक्षम होने के लिए तत्पर हैं।
क्या यह भविष्य में जीसी की भविष्य में रिलीज में किया जा सकता है? – Larry
संभवतः वे इसे काम करने के लिए कोई रास्ता नहीं ढूंढ सके। – immibis