ओवरलैपिंग फ़ील्ड के साथ रिकॉर्ड प्रकारों को एकजुट करें

Dec 31 2020

मेरे पास निम्नलिखित कोड हैं:

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 }, लेकिन यह अच्छा नहीं लगता है।

जवाब

bklaric Dec 31 2020 at 05:10

Record.Extra पर पाया के identityसाथ की जगह दूसरा रिकॉर्ड से "फेंकता है" इसलिए प्रकार एकीकृत होते हैं।pickfieldIDontCareAbout