gpt4 book ai didi

f# - 如何从类型提供程序中的调用引用中调用函数?

转载 作者:行者123 更新时间:2023-12-05 00:16:21 25 4
gpt4 key购买 nike

我有一个类型提供程序,它给了我错误“将表达式拼接为引号文字时类型不匹配”。

我提取了下面的代码,以便在较小的上下文中重现该问题。

let f (s : string) : string = s //some dummy implementation

let t = ProvidedTypeDefinition(asm, ns, "Root", Some typeof<obj>)
let ctor = ProvidedConstructor(parameters = [],
InvokeCode = (fun args -> <@@ "root" :> obj @@>)) :> MemberInfo

let prop = ProvidedProperty(propertyName = "SomeProperty",
parameters = [],
propertyType = typeof<string>,
GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)) :> MemberInfo

do t.AddMembers [ctor; prop]
t.SetBaseType typeof<obj>

...当我使用类型提供程序时
let root = Provided.Root()

let a = root.SomeProperty

我收到错误:

Error: The type provider 'typeproviders.providerpoc+MyProvider' reported an error in the context of provided type 'typeproviders.providerpoc.Provided.Root', member 'get_Menu'.

The error: Type mismatch when splicing expression into quotation literal.

The type of the expression tree being inserted doesn't match the type expected by the splicing operation.

Expected 'System.Object', but received type 'System.String'.

Consider type-annotating with the expected expression type, e.g., (%% x : string) or (%x : string).. Parameter name: receivedType.



如何编写报价单才能在报价单中调用函数?

谢谢!

最佳答案

错误消息是说您正在放置一个类型为 obj 的带引号的表达式。在类型为 string 的引用表达式的地方是期待。

我怀疑在创建 GetterCode 时会发生这种情况。在提供的属性中:

GetterCode = (fun args -> <@@ f %%(args.[0]) @@>)

在这里, args是一个带引号的表达式数组,其中每个表达式的类型都是 obj , 但函数 f需要一个字符串,因此引用使用 %% 填充孔洞应该是 string 类型

添加一个类型转换,它会变成 obj进入 string应该做的伎俩:
GetterCode = (fun args -> <@@ f (unbox<string> (%%(args.[0]))) @@>)

关于f# - 如何从类型提供程序中的调用引用中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42027202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com