Citas de F #: recorrido en llamadas a funciones representadas por un valor

Pasé algunas horas tratando de entender las citas de F #, pero me encontré con un obstáculo. Mi requisito es tomar funciones simples (solo enteros, +, -, /, *) de un tipo de unión discriminada y generar un árbol de expresión que eventualmente se usará para generar código C. Sé que esto es posible usando citas con funciones 'directas'.

Mi problema es que el árbol de expresión parece terminar con un "Valor", y no puedo entender cómo atravesar ese valor.

Mi pregunta es si esto es realmente posible en esta situación. o hay otros enfoques que vale la 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

Respuestas a la pregunta(1)

Su respuesta a la pregunta