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 identity
dengan unsafeCoerce
, tetapi saya menginginkan solusi yang aman bagi tipe. Saya juga dapat secara manual memilih bidang yang saya butuhkan dengan mengganti identity
dengan \{ importantField } -> { importantField }
, tapi itu tidak terlihat bagus.
Jawaban
Mengganti identity
dengan yang pick
ditemukan di Record.Extra "membuang" fieldIDontCareAbout
dari rekaman kedua sehingga tipe menyatu.