F# 使用类型提供程序实例进行Duck类型化

F# 使用类型提供程序实例进行Duck类型化,f#,type-providers,duck-typing,F#,Type Providers,Duck Typing,我正在编写一个F#脚本来操作数据库中的表。所有表都有一个Guid Id属性。我想利用duck类型在几个地方引用这个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

我正在编写一个F#脚本来操作数据库中的表。所有表都有一个
Guid Id
属性。我想利用duck类型在几个地方引用这个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)
让内联getallid)=
表|>Seq.map(乐趣x->x.Id)
我曾希望
when'a:(成员Id:Guid with get)
约束允许我在表记录上使用
Id
属性,但我得到了一个类型推断错误(“可能需要类型注释”等)

此外,如果我试图将一个没有
Guid Id
属性的表传递给函数,它会正确地抱怨它不支持操作符
get\u Id
。这似乎向我表明,我的语法是正确的,但可能需要一个额外的约束。我想做的事可能吗


(我知道我可以将一个函数传递到此函数中以检索ID…但这其中的乐趣何在?!)

我会坚持认为这是一个副本,但下面是您需要执行的确切代码:

let inline getAllIds< ^a when ^a : not struct> (table : Table< ^a>) =
    table |> Seq.map (fun x -> (^a : (member Id : Guid with get) x))
当^a:非结构>(表:表<^a>)时,让内联getAllID<^a)=
表|>Seq.map(fun x->(^a:(成员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))
当^a:非结构>(表:表<^a>)时,让内联getAllID<^a)=
表|>Seq.map(乐趣x->(^a:(成员获取Id:unit->Guid)x))

IIRC,使用3.0版本之前的F#编译器时需要后一种语法。

“将函数传递到此函数”找到了它……唉,有一个+1:pThanks!你说得对,这是一个与你在评论中链接的问题重复的问题