2017-06-23 7 views
9

निम्नलिखित पर विचार करें:बेवकूफ दोहराया रिकॉर्ड फ़ील्ड त्रुटि

निम्न संदेश
{-# LANGUAGE DuplicateRecordFields #-} 

data A = A { name :: String } 

data B = B { name :: String } 

main = print $ name (A "Alice") 

जब संकलित, मैं (GHC 8.0.2 पर)

duplicatedrecords.hs:7:16: error: 
    Ambiguous occurrence ‘name’ 
    It could refer to either the field ‘name’, 
          defined at duplicatedrecords.hs:5:14 
          or the field ‘name’, defined at duplicatedrecords.hs:3:14 

लेकिन इस प्रकार अगर मैं main लाइन को संशोधित :

main = print $ name ((A "Alice") :: A) 

संकलन सफलतापूर्वक प्राप्त होता है।

यह क्यों है? प्रकार हस्ताक्षर :: A मेरे लिए अनावश्यक लगता है, निश्चित रूप से A कन्स्ट्रक्टर यह संकलक को स्पष्ट करता है कि (A "Alice")A प्रकार का है। लेकिन किसी कारण से यह एक फर्क पड़ता है। यह क्यों है और क्या ऐसा कोई तरीका है जिसे मैं हर जगह अतिरिक्त प्रकार के हस्ताक्षरों को कूड़े बिना संकलित करने के लिए प्राप्त कर सकता हूं?

नोट:

यह ध्यान देने योग्य है कि निम्नलिखित ठीक संकलित लायक है:

data A = A { a_name :: String } 
data B = B { b_name :: String } 

class Name t where 
    name :: t -> String 

instance Name A where name = a_name 
instance Name B where name = b_name 

main = print $ name (A "Alice") 

हम भी आगे जा सकते हैं इस प्रकार है, अलग अलग परिणाम प्रकार की अनुमति देता है:

{-# LANGUAGE TypeFamilies #-} 

data A = A { a_name :: String } 
data B = B { b_name :: Int } 

class Name t where 
    type family T t 
    name :: t -> T t 

instance Name A where 
    type T A = String 
    name = a_name 

instance Name B where 
    type T B = Int 
    name = b_name 

main = print $ name (A "Alice") 

ऐसा लगता है जीएचसी की तरह ही प्रत्येक अद्वितीय रिकॉर्ड नाम के लिए यांत्रिक रूप से एक वर्ग जोड़ना होता है और प्रत्येक डेटा प्रकार में प्रत्येक रिकॉर्ड के लिए एक उदाहरण होता है। इसका मतलब यह होगा कि name x == name y का अर्थ यह नहीं है कि x और y के प्रकार समान हैं लेकिन मुझे उम्मीद है कि इस एक्सटेंशन का उपयोग करते समय भी।

बस सोच रहा है कि क्या कुछ भी मुश्किल है, मैं कार्यान्वयन के संबंध में यहां याद कर रहा हूं या इसे किसी को करने की आवश्यकता है?

उत्तर

6

-XDuplicateRecordFields वर्तमान में तर्कों से प्रकारों का अनुमान नहीं लगाता है।

GHC user guide section about this extension देखें।

हालांकि, हम डेटाटाइप निर्धारित करने के लिए तर्क के प्रकार का अनुमान नहीं लगाते हैं, या बाधा सॉल्वर को पसंद का निर्धारण करने का कोई तरीका नहीं है। इस प्रकार निम्नलिखित संदिग्ध है:

लेकिन चीजें सुधार रही हैं। इसलिए हम उम्मीद कर सकते हैं और अंत में वांछित व्यवहार मिलता है:

https://prime.haskell.org/wiki/TypeDirectedNameResolution

+0

धन्यवाद Shersh, कि क्या मैं के बारे में कहना था। वर्तमान व्यवहार क्लिंटन की तलाश में सड़क पर आधे रास्ते का घर है। उस समय आप उसे लेंस पैकेज देख सकते थे। – AntC

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