统一具有重叠字段的记录类型
Unify record types with overlapping fields
我有以下代码:
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
中,我完全没问题。我该怎么做?
我试过在不同的地方(第一条记录、第二条记录、整个表达式)添加类型注释,但都没有成功。我总是可以用 unsafeCoerce
替换 identity
,但我想要一个类型安全的解决方案。我也可以通过将 identity
替换为 \{ importantField } -> { importantField }
来手动挑选我需要的字段,但这看起来不太好。
用在 Record.Extra 处找到的 pick
替换 identity
从第二条记录中“丢弃” fieldIDontCareAbout
以便类型统一。
我有以下代码:
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
中,我完全没问题。我该怎么做?
我试过在不同的地方(第一条记录、第二条记录、整个表达式)添加类型注释,但都没有成功。我总是可以用 unsafeCoerce
替换 identity
,但我想要一个类型安全的解决方案。我也可以通过将 identity
替换为 \{ importantField } -> { importantField }
来手动挑选我需要的字段,但这看起来不太好。
用在 Record.Extra 处找到的 pick
替换 identity
从第二条记录中“丢弃” fieldIDontCareAbout
以便类型统一。