Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将变量定义注入F#引号_F#_Quotations - Fatal编程技术网

将变量定义注入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