You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PureScript中如何将缺少指定字段的行类型记录作为函数参数

PureScript 为缺失指定字段的记录自动补全默认值

需求场景

首先定义目标行类型:

type FooBarBaz =
  ( foo :: Int
  , bar :: String
  , baz :: Boolean
  )

需要实现withoutFoo函数:入参为不包含foo字段的上述行类型子集记录,函数自动为入参加上默认值为1的foo字段,预期调用效果如下:

withoutFoo { bar: "bar", baz: true} -- 返回 { foo: 1, bar: "bar", baz: true}

初始无效实现

最初尝试搭配Lacks、Cons约束编写实现,代码如下,但无法正常通过类型检查生效:

withoutFoo :: ∀ r.
  Lacks "foo" r =>
  Cons "foo" Int r FooBarBaz =>
  { | r } -> { | FooBarBaz }
withoutFoo props = Record.union { foo: 1 } props

正确实现方案

最终通过Union约束解决了类型问题,可正常运行的代码如下:

withoutFoo :: ∀ r.
  Union r ( foo :: Int ) FooBarBaz =>
  { | r } -> { | FooBarBaz }
withoutFoo props =
  Record.merge props { foo: 1 }

Union r r1 r2约束的含义是行类型r与r1无重复字段,且二者的并集为r2,刚好匹配当前场景:既保证入参记录不会携带重复的foo字段,也能约束补全字段后的记录完全符合FooBarBaz类型,配合Record.merge完成两个无重复字段记录的合并即可。

内容的提问来源于stack exchange,提问作者WHITECOLOR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:57:20