代码引用和表达式树

时间:2011-11-15 09:07:34

标签: f# expression-trees quotations

我想知道这两个功能在引擎盖下如何实现有什么不同?即是不是只在旧的良好表达树之上构建代码引用?

感谢。

1 个答案:

答案 0 :(得分:21)

这两种类型非常相似,但它们的表现方式不同。

  • 报价以更实用的方式设计。例如,foo a b将表示为一系列应用App(App(foo, a), b)

  • 引用可以表示仅在F#中可用的一些构造,并且使用表达式树会隐藏它们。例如Expr.LetRecursive声明{/ 1}}

  • 引用最初是在.NET 3.0中引入的。当时表达式树只能代表C#表达式,因此不可能轻松捕获所有F#构造(引用可以捕获任何F#表达式,包括命令式表达式)。

  • 报价也可以使用递归轻松处理。 let rec模块包含的模式允许您仅使用4种情况处理所有可能的引用(这比使用C#中的数十种方法实现访问者模式要容易得多)。

当您使用F#引用时,可以使用FSharp.Quotations.Evaluator将其转换为C#表达式树。如果您正在使用一些期望来自F#的表达式树的.NET API,这非常有用。据我所知,反过来没有翻译。