Унифицировать типы записей с перекрывающимися полями

Dec 31 2020

У меня такой код:

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

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

Это не компилируется, потому что первая запись не имеет расширения fieldIDontCareAbout. Тем не менее, у меня все в порядке, если он объединяется, forall fields. { importantField :: Int | fields }чтобы он попал в workWithImportantField. Как бы я это сделал?

Я пробовал добавлять аннотации типов в различные места (первая запись, вторая запись, все выражение) безуспешно. Я всегда могу заменить identityна unsafeCoerce, но мне нужно типобезопасное решение. Я также могу вручную выбрать нужные поля, заменив их identityна \{ importantField } -> { importantField }, но это выглядит не очень хорошо.

Ответы

bklaric Dec 31 2020 at 05:10

Замена identityна pickнайденный в Record.Extra "выбрасывает" fieldIDontCareAboutиз второй записи, поэтому типы унифицируются.