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
相关产品推荐
相关产品推荐

