Satukan tipe rekaman dengan bidang yang tumpang tindih

Dec 31 2020

Saya memiliki kode berikut:

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

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

Ini tidak dapat dikompilasi karena record pertama tidak memiliki ekstensi fieldIDontCareAbout. Namun, saya baik-baik saja jika itu menyatu forall fields. { importantField :: Int | fields }sehingga dilewatkan workWithImportantField. Bagaimana saya akan melakukan itu?

Saya sudah mencoba menambahkan anotasi tipe ke berbagai tempat (catatan pertama, catatan kedua, seluruh ekspresi) tanpa hasil. Saya selalu dapat menggantinya identitydengan unsafeCoerce, tetapi saya menginginkan solusi yang aman bagi tipe. Saya juga dapat secara manual memilih bidang yang saya butuhkan dengan mengganti identitydengan \{ importantField } -> { importantField }, tapi itu tidak terlihat bagus.

Jawaban

bklaric Dec 31 2020 at 05:10

Mengganti identitydengan yang pickditemukan di Record.Extra "membuang" fieldIDontCareAboutdari rekaman kedua sehingga tipe menyatu.