รวมชนิดของเรกคอร์ดด้วยเขตข้อมูลที่ทับซ้อนกัน
ฉันมีรหัสต่อไปนี้:
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
แทนที่identity
ด้วยpick
found at Record.Extra "พ่นออกไป" fieldIDontCareAbout
จากระเบียนที่สองเพื่อให้ประเภทรวมกัน