Unifique os tipos de registro com campos sobrepostos

Dec 31 2020

Eu tenho o seguinte código:

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

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

Isso não compila porque o primeiro registro não tem o fieldIDontCareAbout. No entanto, estou perfeitamente bem se ele se unificar forall fields. { importantField :: Int | fields }para que seja passado para workWithImportantField. Como eu faria isso?

Tentei adicionar anotações de tipo a vários lugares (primeiro registro, segundo registro, a expressão inteira) sem sucesso. Sempre posso substituir identitypor unsafeCoerce, mas gostaria de uma solução de segurança de tipo. Também posso escolher manualmente os campos de que preciso substituindo identitypor \{ importantField } -> { importantField }, mas isso não parece bom.

Respostas

bklaric Dec 31 2020 at 05:10

Substituindo identitypor pickencontrado em Record.Extra "joga fora" fieldIDontCareAboutdo segundo registro para que os tipos se unifiquem.