代码引用和表达式树

14

我想知道这两个特性在实现上有什么区别?也就是说,难道不是只是在旧的表达式树之上构建代码引用吗?

谢谢。

1个回答

22
这两种类型相似,但它们的表示方式不同。
- 引用(Quotations)的设计更加功能化。例如,foo a b会被表示为一系列应用程序App(App(foo, a), b)。 - 引用可以表示一些仅在F#中可用的结构,使用表达式树会隐藏它们。例如,有Expr.LetRecursive用于let rec声明. - 引用最初是在.NET 3.0中引入的。当时,表达式树只能表示C#表达式,因此无法轻松捕获所有F#结构(引用可以捕获任何F#表达式,包括命令式语句)。 - 引用的设计也便于使用递归进行处理。 ExprShape模块包含的模式允许你只用4个案例就可以处理所有可能的引用(这比在C#中实现拥有数十个方法的访问者模式容易得多)。
当你有一个F#引用时,你可以使用FSharp.Quotations.Evaluator将其转换为C#表达式树。如果你正在使用期望来自F#的表达式树的某些.NET API,则这非常有用。据我所知,反过来没有翻译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接