निम्नलिखित पर विचार करें:बेवकूफ दोहराया रिकॉर्ड फ़ील्ड त्रुटि
निम्न संदेश{-# 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
के प्रकार समान हैं लेकिन मुझे उम्मीद है कि इस एक्सटेंशन का उपयोग करते समय भी।
बस सोच रहा है कि क्या कुछ भी मुश्किल है, मैं कार्यान्वयन के संबंध में यहां याद कर रहा हूं या इसे किसी को करने की आवश्यकता है?
धन्यवाद Shersh, कि क्या मैं के बारे में कहना था। वर्तमान व्यवहार क्लिंटन की तलाश में सड़क पर आधे रास्ते का घर है। उस समय आप उसे लेंस पैकेज देख सकते थे। – AntC