将变量定义注入F#引号
我有一个自定义变量定义,我想将其插入到引号中。有糖的话可能吗 我想做的是:将变量定义注入F#引号,f#,quotations,F#,Quotations,我有一个自定义变量定义,我想将其插入到引号中。有糖的话可能吗 我想做的是: open Microsoft.FSharp.Quotations let var = Var("myvar", typeof<int>) let op = <@@ fun l -> match l with | [] -> 0 | %%myvar :: _ -> ... @@> 打开Microsoft.FSharp.quotes 设var=var
open Microsoft.FSharp.Quotations
let var = Var("myvar", typeof<int>)
let op = <@@ fun l -> match l with
| [] -> 0
| %%myvar :: _ -> ... @@>
打开Microsoft.FSharp.quotes
设var=var(“myvar”,typeof)
让op=l与
| [] -> 0
|%%myvar::->…@>
我也尝试过类似的目的
在这两种情况下,我都得到了FS0010“绑定中意外的前缀运算符”或“…在模式匹配中”
有没有办法像这样注入现有的Var?还是必须手动生成整个表达式
PS:我用这整件事来把其他AST翻译成F#引号。你在问题中描述的东西真的有点荒谬。不能将表达式拼接到表达式中。只能拼接类型为
Expr
的值。如果您通过创建了Expr
our的var
实例,则可以进行拼接:
let var = Expr.Var( Var("myvar", typeof<int>) )
let op = <@@ fun l -> %%var @@>
这将产生以下报价:
fun l -> match l with
| [] -> 0
| myvar :: _ -> myvar + 42
fun l -> match l with
| [] -> 0
| myvar :: _ -> (fun myvar -> myvar + 42) myvar
如果这是您的意图,那么我建议让mkRightSide
返回一个函数,该函数只需将myvar
作为参数:
let mkRightSide = <@@ fun myvar -> myvar + 42 @@>
let op = <@@ fun l -> match l with
| [] -> 0
| (myvar:int) :: _ -> (%%mkRightSide) myvar @@>
注1:myvar
上的类型注释是必要的,因为您的报价是非类型化的。由于mkrighthside
不携带类型信息,编译器无法将myvar
推断为int
,而是将其设置为泛型,这会在尝试拼接时导致类型不匹配
注2:(%mkRightSide)
周围的括号是必需的。没有它们,编译器会将其理解为%%(mkrightsidemyvar)
,因为函数应用程序的优先级高于%%
运算符
如果我猜错了你的意图,请澄清,我很乐意修改答案。你猜对了我的意图。我之所以避免函数调用,是因为我目前关注的是性能。实际上,在项目的当前状态下,我收到一个lambda来调用head-tail对,但我故意用实际head和tail替换terms来减少它(例如,我重写lambda树,分别用head或tail替换arg访问)。我想我只能求助于手工制作那场比赛了。
fun l -> match l with
| [] -> 0
| myvar :: _ -> (fun myvar -> myvar + 42) myvar