Ujednolicenie typów rekordów z nakładającymi się polami

Dec 31 2020

Mam następujący kod:

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

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

To się nie kompiluje, ponieważ pierwszy rekord nie ma rozszerzenia fieldIDontCareAbout. Jednak jestem całkowicie w porządku, jeśli się zjednoczy, forall fields. { importantField :: Int | fields }więc zostanie przekazany workWithImportantField. Jak bym to zrobił?

Próbowałem dodawać adnotacje typu w różnych miejscach (pierwszy rekord, drugi rekord, całe wyrażenie) bez powodzenia. Zawsze mogę wymienić identityz unsafeCoerce, ale chciałbym rozwiązanie typu bezpieczny. Mogę również ręcznie wybrać potrzebne pola, zastępując identityje \{ importantField } -> { importantField }, ale to nie wygląda ładnie.

Odpowiedzi

bklaric Dec 31 2020 at 05:10

Zastąpienie identityprzez pickznalezione w Record.Extra "wyrzuca" fieldIDontCareAboutz drugiego rekordu, więc typy się ujednolicają.