Satukan tipe rekaman dengan bidang yang tumpang tindih
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
Mengganti identitydengan yang pickditemukan di Record.Extra "membuang" fieldIDontCareAboutdari rekaman kedua sehingga tipe menyatu.