Citações F # - atravessando chamadas de função representadas por um valor
Passei algumas horas tentando entender as cotações de F #, mas me deparei com um obstáculo. Meu requisito é tirar funções simples (apenas números inteiros, +, -, /, *) de um tipo de união discriminada e gerar uma árvore de expressão que eventualmente será usada para gerar o código C. Eu sei que isso é possível usando Cotações com funções 'diretas'.
Meu problema é que a árvore de expressão parece terminar com um "Valor", e não consigo descobrir como atravessar esse valor.
Minhas perguntas é se isso é realmente possível nesta situação? ou existem outras abordagens que valem a pena considerar.
type FuncType =
| A of (int -> int -> int)
| B
| C
[<ReflectedDefinition>]
let add x y = x + y
let myFunc1 = A (fun x y -> x + y )
let myFunc2 = A add
let thefunc expr =
match expr with
| A(x) ->
<@ x @>
| _ ->
failwith "fail"
printfn "%A" (thefunc myFunc1) // prints "Value (<fun:myFunc1@14>)"
printfn "%A" (thefunc myFunc2) // prints "Value (<fun:myFunc2@15>)"
printfn "%A" <@ fun x y -> x + y @> // generates usable expression tree