2016-12-07 10 views
7

संबंधित पोस्ट: How to disambiguate selector function?क्यों डुप्लिकेट रिकार्डफ़िल्ड्स में टाइप अनुमान नहीं हो सकता है?

https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/DuplicateRecordFields

हालांकि, हम डेटाप्रकार निर्धारित करने के लिए तर्क के प्रकार का अनुमान लगा नहीं है, या बाधा solver के लिए चुनाव टाल की किसी भी तरह की है।

यह वास्तव में परेशान है कि यह सुविधा लागू नहीं की गई है। मैंने कई स्रोतों को देखने की कोशिश की लेकिन मुझे कोई कारण नहीं मिला कि वे किस प्रकार का अनुमान लगाने का फैसला नहीं करते हैं।

क्या किसी को इसके लिए एक अच्छा कारण पता है? क्या यह वर्तमान प्रकार की प्रणाली की सीमा के कारण है?

+0

क्या यह भविष्य में जीसी की भविष्य में रिलीज में किया जा सकता है? – Larry

+0

संभवतः वे इसे काम करने के लिए कोई रास्ता नहीं ढूंढ सके। – immibis

उत्तर

9

आप 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 करने में सक्षम होने के लिए तत्पर हैं।

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