Unifique os tipos de registro com campos sobrepostos
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
Substituindo identitypor pickencontrado em Record.Extra "joga fora" fieldIDontCareAboutdo segundo registro para que os tipos se unifiquem.