- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是:
当我在设计时不知道这些表达式的数量和类型时,如何将列表中的表达式拼接成一个引用?
在底部,我包含了类型提供程序的完整代码。 (我已经剥离了这个概念来证明这个问题。)我的问题出现在这些行:
let func = ProvidedMethod((*...*), InvokeCode = fun args ->
<@@ let stringParts =
args
|> List.mapi (fun i arg ->
if paramTypes.[i] = typeof<int> then
sprintf "%i" (%%arg: int)...
在 lambda 参数 arg
上,我得到以下错误:
error FS0446: The variable 'arg' is bound in a quotation but is used as part of a spliced expression. This is not permitted since it may escape its scope.``
我不知道如何编写代码,以便在提供程序设计时不知道值的数量和类型时“提取”参数值(尽管它们在编译时会知道)。
当我在设计时知道参数的存在和类型时,我可以这样做:
printfn "%A"(%%args.[0]: int)
但我无法弄清楚如何从 Expr list
输入到引用中的 obj list
。
这是完整的类型提供程序代码:
[<TypeProvider>]
type SillyProviderDefinition(config: TypeProviderConfig) as self =
inherit TypeProviderForNamespaces()
let sillyType = ProvidedTypeDefinition(THIS_ASSEMBLY, NAMESPACE, "SillyProvider", Some typeof<obj>)
do sillyType.DefineStaticParameters([ProvidedStaticParameter("argTypes", typeof<string>)], fun typeName args ->
let retType = ProvidedTypeDefinition(typeName, Some typeof<obj>)
let paramTypes =
(args.[0] :?> string).Split([|'|'|])
|> Array.map (function
| "int" -> typeof<int>
| "string" -> typeof<string>
| x -> failwithf "Invalid argType %A. Only string or int permitted" x)
let parameters =
paramTypes
|> Array.mapi (fun i p -> ProvidedParameter(sprintf "arg%i" i, p))
|> Array.toList
let func = ProvidedMethod("Stringify", parameters, typeof<string>, IsStaticMethod = true, InvokeCode = fun args ->
<@@ let stringParts =
args
|> List.mapi (fun i arg ->
if paramTypes.[i] = typeof<int> then
sprintf "%i" (%%arg: int)
elif paramTypes.[i] = typeof<string> then
(%%arg: string)
else
failwith "Unexpected arg type")
//printfn "%A" (%%args.[0]: int)
String.Join("", stringParts) @@>)
do retType.AddMember func
do sillyType.AddMember retType
retType)
do self.AddNamespace(NAMESPACE, [sillyType])
最佳答案
作为一个最小的例子,假设我们有一个带有类型的列表和一个带有一些引号的列表(在类型提供者的上下文中,您有类型列表,args
是引号列表,可能还包含this
实例):
open Microsoft.FSharp.Quotations
let tys = [ typeof<int>; typeof<string> ]
let args = [ Expr.Value(42); Expr.Value("test"); ]
我们要构造一个调用formatInt
的表达式或 formatString
根据类型,然后连接所有格式化字符串:
let formatInt (n:int) = string n
let formatString (s:string) = s
现在,重要的是要区分在提供的引用代码(引用级别)和运行以生成引用的普通代码(代码级别)中发生了什么。在代码级别,我们遍历所有类型和带引号的参数,并通过调用 formatInt
生成引号列表。或 formatString
- 可以输入 Expr<string>
因为它们具有相同的类型:
let formattedArgList =
[ for t, e in List.zip tys args ->
if t = typeof<int> then <@ formatInt %%e @>
elif t = typeof<string> then <@ formatString %%e @>
else failwith "!" ]
现在您可以通过调用 fold
来构建列表表达式在代码级别并使用列表 ::
引用级别的运算符:
let listArgExpr =
formattedArgList
|> List.fold (fun state e -> <@ %e::%state @>) <@ [] @>
现在您可以用引用 String.concat
构建报价单调用:
<@ String.concat "," %listArgExpr @>
关于F# Type Provider development : When providing a method, 如何获取变量个数和类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43455091/
我在 A 和 B 两个团队工作。因此我需要创建和安装两个开发证书。当我在 Xcode 的“build设置”中将“代码签名身份”设置为一般值“iOS Developer”时,我两个团队的应用程序正在构建
我刚刚将 XCode 升级到 4.3.1。我正在使用脚本来构建(然后通过 Testflight 部署)我的应用程序。但我现在收到此错误: Error: No developer directory f
我找不到在 Firefox Developer Edition 56.0b4 上的所有 .js 和 .css 文件中搜索字符串的方法。 我找到了办法,但那是在52版本之前。我想知道为什么他们删除了这个
我制作了一个 Gatsby starter,两个不同的人向我报告说他们无法运行它,因为它在构建“开发包”时卡住了。开发和生产构建都不起作用。我无法在我自己的机器上重现这个问题,但我想为想要使用我的 s
我正在尝试创建一个过去 3 周的苹果开发者帐户。选择后 “选择您的实体类型 = 个人”和“条款和条件 = 同意” 出现错误提示“您的注册无法完成”。我给支持打了几次电话,发了几次邮件,他们都只是简单地
我会使用robovm填写我正在使用Android libgdx进行研究的应用程序,但我无法识别证书。 xcode首选项中的证书已正确下载,然后通常可以正常使用....我做了什么,因为它已过期,然后我使
如何禁用 同源政策在 Firefox 开发者版中。出于某种原因,我认为在 Developer Edition 中执行此操作应该很容易,但我找不到设置。 最佳答案 老实说,您不应该在任何浏览器中执行此操
我有一个提交列表(最新的在前): abcd4 message abcd3 wrong commit message2 abcd2 wrong commit message1 abcd1 message
假设当前分支是 MyFeatureX。并且本地 develop 分支是最新的。下面的两个陈述是等价的吗?推荐的语法是什么? git rebase origin/develop git rebase d
我刚刚 merge 了我的整个 develop history历史进入我的主分支。正如我所见,应该连接 network graph 中的两个分支,它没有。另外,我的主分支显示:This branch
嗨,我有一个基于主分支的开发分支。 我在开发分支中进行了更改。 现在,我的问题是如果要更新 master 分支,如何在不丢失我在 develop 分支中的更改的情况下升级基于 master 分支的 d
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
与 firebug 相比,我更喜欢 firefox 开发人员检查器。 但是可以在原生 JS 控制台中显示 PHP 日志吗? 谢谢 :) 最佳答案 我刚刚安装了 Chrome Logger ( gith
今天我注意到我的 Mac 上有最新版本的 Xcode,一个在/Developer/Applications 中,另一个在/Applications 中。 /Applications 中的那个是 App
这很奇怪。显然,针对我的本地 develop 分支和远程 develop 分支进行 rebase 之间存在一些差异。以下是一些详细信息: 假设我有一个特性分支,feat,我不时对其进行 rebase:
这个问题在这里已经有了答案: difference between origin/branch_name and branch_name? (4 个答案) 关闭 5 年前。 我是新手,开始在项目中使
已经有很多关于此的问题回答了我的一些问题。我正在寻找在设置和管理这两个帐户方面有直接经验的人。 我有一种情况需要向超过 100 人发送私有(private) Beta 测试(iOS 的临时设备限制),
我想了解如何获取开发人员ID应用程序或开发人员ID安装程序证书的私钥? 开发人员ID证书只能由帐户持有者 https://developer.apple.com/support/roles/创建-完成
Mac Developer中的3rd Party Mac Developer Application和Code Signing Identity配置文件有什么区别?哪个是Mac App Store发行
我正在尝试使用 OminChannel 方法将 Google Pay 集成到我的网站中。官方文档提到 要打开 Google API 库,请从导航菜单中选择 API 和服务 > 库。搜索“NBU 付款
我是一名优秀的程序员,十分优秀!