Vereinheitlichen Sie Datensatztypen mit überlappenden Feldern

Dec 31 2020

Ich habe folgenden Code:

workWithImportantField :: forall fields. { importantField :: Int | fields } -> Input
workWithImportantField = ...

workWithImportantField $ 
maybe { importantField: 1 } identity (Just { importantField: 1, fieldIDontCareAbout: "whatever" })

Dies wird nicht kompiliert, da der erste Datensatz nicht über das verfügt fieldIDontCareAbout. Ich bin jedoch vollkommen in Ordnung, wenn es sich vereinigt, forall fields. { importantField :: Int | fields }so dass es weitergegeben wird workWithImportantField. Wie würde ich das machen?

Ich habe erfolglos versucht, an verschiedenen Stellen (erster Datensatz, zweiter Datensatz, der gesamte Ausdruck) Typanmerkungen hinzuzufügen. Ich kann immer ersetzen identitymit unsafeCoerce, aber ich würde eine typsichere Lösung gefällt. Ich kann auch manuell auswählen , die Felder , die ich durch das Ersetzen muß identitymit \{ importantField } -> { importantField }, aber das schön aussieht nicht.

Antworten

bklaric Dec 31 2020 at 05:10

Das Ersetzen identitydurch pickgefunden bei Record.Extra "wirft" fieldIDontCareAboutvom zweiten Datensatz weg, damit sich die Typen vereinheitlichen.