Unifier les types d'enregistrement avec des champs qui se chevauchent

Dec 31 2020

J'ai le code suivant:

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

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

Cela ne compile pas car le premier enregistrement n'a pas l'extension fieldIDontCareAbout. Cependant, je vais parfaitement bien s'il s'unifie forall fields. { importantField :: Int | fields }pour qu'il soit transmis workWithImportantField. Comment pourrais-je faire ça?

J'ai essayé d'ajouter des annotations de type à divers endroits (premier enregistrement, deuxième enregistrement, l'expression entière) sans succès. Je peux toujours remplacer identitypar unsafeCoerce, mais j'aimerais une solution de type sécurisé. Je peux également sélectionner manuellement les champs dont j'ai besoin en les remplaçant identitypar \{ importantField } -> { importantField }, mais cela n'a pas l'air sympa.

Réponses

bklaric Dec 31 2020 at 05:10

Remplacer identitypar pickfound at Record.Extra "jette" fieldIDontCareAboutdu deuxième enregistrement afin que les types s'unifient.