Hợp nhất các loại bản ghi với các trường chồng chéo

Dec 31 2020

Tôi có mã sau:

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

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

Điều này không biên dịch vì bản ghi đầu tiên không có fieldIDontCareAbout. Tuy nhiên, tôi hoàn toàn ổn nếu nó hợp nhất forall fields. { importantField :: Int | fields }để nó được truyền vào workWithImportantField. Làm thế nào tôi sẽ làm điều đó?

Tôi đã thử thêm chú thích kiểu vào nhiều nơi khác nhau (bản ghi đầu tiên, bản ghi thứ hai, toàn bộ biểu thức) mà không thành công. Tôi luôn có thể thay thế identitybằng unsafeCoerce, nhưng tôi muốn một giải pháp an toàn về loại. Tôi cũng có thể chọn thủ công các trường tôi cần bằng cách thay thế identitybằng \{ importantField } -> { importantField }, nhưng điều đó trông không đẹp.

Trả lời

bklaric Dec 31 2020 at 05:10

Thay thế identitybằng picktìm thấy tại Record.Extra "loại bỏ" fieldIDontCareAboutbản ghi thứ hai để các loại thống nhất.