使用类型提供程序实例打字

时间:2015-06-16 15:48:08

标签: f# type-providers duck-typing

我正在编写一个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 ......但那里的乐趣在哪里?!)

1 个答案:

答案 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))
IIRC,当使用3.0之前的F#编译器时,后一种语法 required