私はこのビットのコードを持っています:
let rec h n z = if n = 0 then z
else <@ (fun x -> %(h (n - 1) <@ x + %z @>)) n @>
http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdfの MetaOcaml の例から変換
この論文では、上記の例がパラメーター3
および.<1>.
(MetaOcaml 表記) を使用して以下を生成することが説明されています。
.<(fun x_1 -> (fun x_2 -> (fun x_3 -> x_3 + (x_2 + (x_1 + 1))) 1) 2) 3>.
ご覧のとおり、 はなどx
に置き換えられます。それ以外の場合は、最も内側の のみを参照するためです。x_1
x_2
x
x
fun
しかし、F# ではこれは許可されていません。コンパイル時に次のエラーが表示されます。問題は、コンパイルして MetaOcaml の出力と同じセマンティックになるように、これをどのように変更できるかということです。
コメントの更新: PowerPack を使用して実際に見積もりを評価します。しかし、エラーはコンパイル時に発生するため、これとは何の関係もないと思います。これまでのところ QuotationEvaluation は機能しています。ただし、それが最も効率的な実装ではない可能性があることはわかっています。
Tomas の回答への更新:x
をグローバルにしたり、スコープをエスケープしたりし
たくありません。しかし、私が欲しいのは
let rec h n z = if n = 0 then z
else (fun x -> (h (n - 1) (x + z))) n
引用符で。あなたの答えは(h 3 <@ 1 @>).Eval() = 4
、上記の結果がどこにあるかを示しますh 3 1 = 7
。そしてここで、私は答えになりたいです7
。