次の関数定義を考えてみましょう:
module Helpers =
[<ReflectedDefinition>]
let dummy (x:int) = x.ToString()
次の引用を使用することにより、その表現をラムダ式として取得します。
<@ dummy @>;;
val it : Expr<(int -> string)> =
Lambda (x, Call (None, dummy, [x]))
この前の質問では、引用符は構文的に引用されたコードを表すと述べられています。つまり、同じ関数を他の関数内にラップしても同じ式を取得できないということです。
let qwrap f = <@ f @>
qwrap dummy;;
val it : Expr<(int -> string)> =
Value (<fun:it@6-3>)
前者の式 (Lambda (x, Call (None, dummy, [x]))) をプログラムで作成することはできますか? 目的は、単純な関数 ('a -> 'b) の動的 qwrap を実装することです。結果の式は分析される予定であり、元の関数に記述されているとおりに関数と引数の名前を保持できることに興味があります。