如何从表达式集合中创建单引号表达式?
How to create a single quotation expression from a collection of expressions?
我有一组(子)引用表达式,它们都是在程序的前一步中创建的。我现在希望能够控制一个大引号表达式的创建,该表达式表示集合中子表达式的某种组合和聚合,但无法让编译器或运行时进行协作!
我的代码示例如下:
[<EntryPoint>]
let main argv =
let expr0 = <@ fun (r : float[]) -> r.[1] @>
let expr1 = <@ fun (r : float[]) -> 1.0 + r.[0] @>
let expr2 = <@ fun (r : float[]) -> 10.0 * r.[0] @>
let expr3 = <@ fun (r : float[]) -> r.[0] * r.[1] @>
let expr4 = <@ fun (r : float[]) -> (r.[0]-2.0) / (r.[1]-9.0) @>
let exprs = [|expr0; expr1; expr2; expr3; expr4|]
let arbInput = [|1.0; 2.0; 3.0; 4.0; 5.0|]
let arbOrder = [|0;4;1;3;4;2|]
let tree = <@ arbOrder |> Array.map (fun x -> (%(exprs.[x]) <| arbInput)) @> //cannot use the variable `x` as part of a spliced expression
printfn "%A" tree
System.Console.ReadLine() |> ignore
0
在强制此行为的其他尝试中收到的其他错误包括:"can't treat ''%' and '%%' as first class..."
我已经尝试了以下答案中提到的步骤: 但我无法找到解决方案。
我怎样才能做到这一点?
您的代码中的问题是 x
是一个带引号的变量,您试图在构建引号时使用它的值,这是不可能的。 x
的使用不能在未引用的部分中。为此,您需要使用 Expr
函数从 Expr<T>[]
:
创建一个 Expr<T[]>
let makeQuotedArray (exprs: Expr<'T>[]) : Expr<'T[]> =
Expr.NewArray(typeof<'T>,
exprs |> Array.map (fun e -> e :> Expr) |> List.ofArray)
|> Expr.Cast
let exprs = makeQuotedArray [|expr0; expr1; expr2; expr3; expr4|]
let tree = <@ arbOrder |> Array.map (fun x -> (%exprs).[x] arbInput) @>
我有一组(子)引用表达式,它们都是在程序的前一步中创建的。我现在希望能够控制一个大引号表达式的创建,该表达式表示集合中子表达式的某种组合和聚合,但无法让编译器或运行时进行协作!
我的代码示例如下:
[<EntryPoint>]
let main argv =
let expr0 = <@ fun (r : float[]) -> r.[1] @>
let expr1 = <@ fun (r : float[]) -> 1.0 + r.[0] @>
let expr2 = <@ fun (r : float[]) -> 10.0 * r.[0] @>
let expr3 = <@ fun (r : float[]) -> r.[0] * r.[1] @>
let expr4 = <@ fun (r : float[]) -> (r.[0]-2.0) / (r.[1]-9.0) @>
let exprs = [|expr0; expr1; expr2; expr3; expr4|]
let arbInput = [|1.0; 2.0; 3.0; 4.0; 5.0|]
let arbOrder = [|0;4;1;3;4;2|]
let tree = <@ arbOrder |> Array.map (fun x -> (%(exprs.[x]) <| arbInput)) @> //cannot use the variable `x` as part of a spliced expression
printfn "%A" tree
System.Console.ReadLine() |> ignore
0
在强制此行为的其他尝试中收到的其他错误包括:"can't treat ''%' and '%%' as first class..."
我已经尝试了以下答案中提到的步骤:
我怎样才能做到这一点?
您的代码中的问题是 x
是一个带引号的变量,您试图在构建引号时使用它的值,这是不可能的。 x
的使用不能在未引用的部分中。为此,您需要使用 Expr
函数从 Expr<T>[]
:
Expr<T[]>
let makeQuotedArray (exprs: Expr<'T>[]) : Expr<'T[]> =
Expr.NewArray(typeof<'T>,
exprs |> Array.map (fun e -> e :> Expr) |> List.ofArray)
|> Expr.Cast
let exprs = makeQuotedArray [|expr0; expr1; expr2; expr3; expr4|]
let tree = <@ arbOrder |> Array.map (fun x -> (%exprs).[x] arbInput) @>