ओवरलैपिंग फ़ील्ड के साथ रिकॉर्ड प्रकारों को एकजुट करें
मेरे पास निम्नलिखित कोड हैं:
workWithImportantField :: forall fields. { importantField :: Int | fields } -> Input
workWithImportantField = ...
workWithImportantField $
maybe { importantField: 1 } identity (Just { importantField: 1, fieldIDontCareAbout: "whatever" })
यह संकलित नहीं है क्योंकि पहला रिकॉर्ड नहीं है fieldIDontCareAbout
। हालाँकि, मैं पूरी तरह से ठीक हूँ अगर यह एकजुट forall fields. { importantField :: Int | fields }
हो जाता है तो इसमें प्रवेश हो जाता है workWithImportantField
। मुझसे यह कैसे होगा?
मैंने विभिन्न स्थानों पर टाइप एनोटेशन जोड़ने की कोशिश की है (पहला रिकॉर्ड, दूसरा रिकॉर्ड, पूरी अभिव्यक्ति) सफलता के बिना। मैं हमेशा की जगह ले सकता identity
के साथ unsafeCoerce
है, लेकिन मैं एक प्रकार सुरक्षित समाधान चाहते हैं। मैं मैन्युअल रूप से उन फ़ील्ड्स को चुन सकता हूं जिनकी मुझे आवश्यकता है , identity
जिनके साथ प्रतिस्थापित कर सकते हैं \{ importantField } -> { importantField }
, लेकिन यह अच्छा नहीं लगता है।
जवाब
Record.Extra पर पाया के identity
साथ की जगह दूसरा रिकॉर्ड से "फेंकता है" इसलिए प्रकार एकीकृत होते हैं।pick
fieldIDontCareAbout