微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

统一具有重叠字段的记录类型

如何解决统一具有重叠字段的记录类型

我有以下代码

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 } 来手动挑选我需要的字段,但这看起来不太好。

解决方法

用在 Record.Extra 处找到的 identity 替换 pick,从第二个记录“扔掉”fieldIDontCareAbout 以便类型统一。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。