รวมชนิดของเรกคอร์ดด้วยเขตข้อมูลที่ทับซ้อนกัน

Dec 31 2020

ฉันมีรหัสต่อไปนี้:

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 Dec 31 2020 at 05:10

แทนที่identityด้วยpickfound at Record.Extra "พ่นออกไป" fieldIDontCareAboutจากระเบียนที่สองเพื่อให้ประเภทรวมกัน