【发布时间】:2020-01-13 00:56:01
【问题描述】:
我正在尝试创建一个通用函数,它要求它的类型参数是一个记录类型,并且它具有特定的属性。这是一个生成相关编译器错误的示例:
let foo<'a> (a : 'a) =
a' = { a with bar = "baz" }
a'
编译这个我得到一个错误声明The record label bar is not defined。
我尝试添加以下类型约束:
let foo<'a when 'a : (member Id : string)> =
// ...
但这也没有编译,抱怨This code is not sufficiently generic. The type variable ^a when ^a : (member get_Int : ^a -> string) could not be generalized because it would escape its scope.
有没有办法指定一个类型约束,让我可以正确地做到这一点?
【问题讨论】:
-
首先你的函数必须是内联的才能被静态约束。您可以创建一个函数来读取具有该属性的任何记录的特定属性,但要克隆它,您不能使用静态约束的
with语法。那时你将需要像反思这样的东西。 -
你应该看看镜头。
-
@FyodorSoikin 我不认为 Lenses 解决了这个问题。甚至多态镜头也不行。如前所述,AFAIK 无法使用成员
bar的静态成员约束来调用{a with bar = ..构造。
标签: generics f# type-constraints