Unifica i tipi di record con i campi sovrapposti

Dec 31 2020

Ho il codice seguente:

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

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

Questo non viene compilato perché il primo record non ha l'estensione fieldIDontCareAbout. Tuttavia, sto perfettamente bene se si unifica in forall fields. { importantField :: Int | fields }modo da essere trasmesso workWithImportantField. Come potrei farlo?

Ho provato ad aggiungere annotazioni di tipo in vari punti (primo record, secondo record, l'intera espressione) senza successo. Posso sempre sostituire identitycon unsafeCoerce, ma vorrei una soluzione indipendente dai tipi. Posso anche scegliere manualmente i campi di cui ho bisogno sostituendoli identitycon \{ importantField } -> { importantField }, ma non sembra carino.

Risposte

bklaric Dec 31 2020 at 05:10

Sostituendo identitycon picktrovato in Record.Extra "getta via" fieldIDontCareAboutdal secondo record in modo che i tipi si uniscano.