在f#项目中,我有以下类型:
type A = { Name: string }
type B = { Name: string; SurName: string }
type C = { Name: string; SurName: string; MaidenName: string }
Run Code Online (Sandbox Code Playgroud)
以及使用泛型参数约束的以下函数:
let inline filterByName<'a when 'a: (member Name: string)> (name: string) (collection: 'a seq) =
collection |> Seq.where(fun i -> i.Name = name)
Run Code Online (Sandbox Code Playgroud)
问题是我得到以下编译时错误:
类型约束不匹配.类型
'一个
与类型不兼容
C
类型'''与'C'类型不匹配
inline从函数定义中删除会给出以下编译时错误:
此代码不够通用.类型变量^ a当^ a :(成员get_Name:^ a - > string)无法泛化,因为它会逃避其范围.
我想要实现的是一个函数,它采用具有特定名称属性的泛型类型,在这种情况下为"Name".我做错了什么或我错过了什么?
问题是你如何调用约束成员 - 你不能使用i.Name语法,而是必须使用更详细的语法.从好的方面来说,这可以推断出方法本身的签名,因此您不必复制所有内容:
let inline filterByName name collection =
collection |> Seq.where(fun i -> (^a : (member Name : string) i) = name)
Run Code Online (Sandbox Code Playgroud)
另请注意,您需要使用静态解析的类型变量(^a)而不是普通的泛型类型变量('a).
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |