我正在编写一个F#脚本来操作数据库中的表。所有表都具有Guid Id
属性。我想利用duck typing在几个地方引用这个ID。
以此功能为例:
let inline getAllIds<'a when 'a : (member Id : Guid with get)
and 'a : not struct> (table : Table<'a>) =
table |> Seq.map (fun x -> x.Id)
我曾希望when 'a : (member Id : Guid with get)
约束允许我在表记录上使用Id
属性,但是我得到了类型推断错误('可能需要类型注释'等)。
此外,如果我尝试向函数传递一个没有Guid Id
属性的表,它会正确地抱怨它不支持运算符get_Id
。这似乎向我表明我的语法正确,但可能需要一个额外的约束。我想做什么?
(我知道我可以将一个函数传递给这个函数来检索ID ......但那里的乐趣在哪里?!)
答案 0 :(得分:4)
我会认为这是重复的,但这是您需要的确切代码:
let inline getAllIds< ^a when ^a : not struct> (table : Table< ^a>) =
table |> Seq.map (fun x -> (^a : (member Id : Guid with get) x))
或者,可以使用以下语法:
let inline getAllIds< ^a when ^a : not struct> (table : Table< ^a>) =
table |> Seq.map (fun x -> (^a : (member get_Id : unit -> Guid) x))