Unifique tipos de registros con campos superpuestos

Dec 31 2020

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 identitycon unsafeCoerce, pero me gustaría una solución de tipo seguro. También puedo seleccionar manualmente los campos que necesito reemplazando identitycon \{ importantField } -> { importantField }, pero eso no se ve bien.

Respuestas

bklaric Dec 31 2020 at 05:10

Reemplazando identitycon pickencontrado en Record.Extra "desecha" fieldIDontCareAboutdel segundo registro para que los tipos se unifican.