Unifique tipos de registros con campos superpuestos
Tengo el siguiente código:
workWithImportantField :: forall fields. { importantField :: Int | fields } -> Input
workWithImportantField = ...
workWithImportantField $
maybe { importantField: 1 } identity (Just { importantField: 1, fieldIDontCareAbout: "whatever" })
Esto no se compila porque el primer registro no tiene la extensión fieldIDontCareAbout
. Sin embargo, estoy perfectamente bien si se unifica forall fields. { importantField :: Int | fields }
para que pase a workWithImportantField
. ¿Cómo haría yo para hacer eso?
Intenté agregar anotaciones de tipo en varios lugares (primer registro, segundo registro, toda la expresión) sin éxito. Siempre puedo reemplazar identity
con unsafeCoerce
, pero me gustaría una solución de tipo seguro. También puedo seleccionar manualmente los campos que necesito reemplazando identity
con \{ importantField } -> { importantField }
, pero eso no se ve bien.
Respuestas
Reemplazando identity
con pick
encontrado en Record.Extra "desecha" fieldIDontCareAbout
del segundo registro para que los tipos se unifican.