我想知道这两个功能在后台的实现方式是否有任何区别?即不只是代码引用建立在旧的良好表达式树之上吗?
谢谢。
这两种类型非常相似,但它们的表示方式不同。
报价以更实用的方式设计。例如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,这将非常有用。据我所知,没有相反的翻译。