2 つの機能が内部で実装されている方法に違いがあるのだろうか? つまり、古い良い式ツリーの上に構築された単なるコード引用ではありませんか?
ありがとう。
2 つの機能が内部で実装されている方法に違いがあるのだろうか? つまり、古い良い式ツリーの上に構築された単なるコード引用ではありませんか?
ありがとう。
2つのタイプは非常に似ていますが、表現が異なります。
見積もりは、より機能的な方法で設計されています。たとえばfoo a b
、一連のアプリケーションとして表されますApp(App(foo, a), b)
引用符は、F#でのみ使用可能ないくつかの構成を表すことができ、式ツリーを使用するとそれらが非表示になります。たとえば、宣言Expr.LetRecursive
用がありますlet rec
引用は.NET3.0で最初に導入されました。当時、式ツリーはC#式しか表現できなかったため、すべてのF#構造を簡単にキャプチャすることはできませんでした(引用符は命令型を含むすべてのF#式をキャプチャできます)。
見積もりは、再帰を使用して簡単に処理できるようにも設計されています。このExprShape
モジュールには、4つのケースですべての可能な見積もりを処理できるパターンが含まれています(これは、C#で数十のメソッドを使用してビジターパターンを実装するよりもはるかに簡単です)。
F#の見積もりがある場合は、FSharp.Quotations.Evaluatorを使用してC#の式ツリーに変換できます。これは、F#からの式ツリーを期待する.NETAPIを使用している場合に非常に便利です。私の知る限り、その逆の翻訳はありません。