Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
561 views
in Technique[技术] by (71.8m points)

purescript - Unify record types with overlapping fields

I have the following code:

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

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

This doesn't compile because the first record doesn't have the fieldIDontCareAbout. However, I'm perfectly fine if it unifies into forall fields. { importantField :: Int | fields } so it gets passed into workWithImportantField. How would I go about doing that?

I've tried adding type annotations to various places (first record, second record, the whole expression) without success. I can always replace identity with unsafeCoerce, but I would like a type-safe solution. I can also manually pick out the fields I need by replacing identity with { importantField } -> { importantField }, but that doesn't look nice.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Replacing identity with pick found at Record.Extra "throws away" fieldIDontCareAbout from the second record so the types unify.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...