ay.*_*llo 14 f# expression-trees quotations
我想知道这两个功能在引擎盖下如何实现有什么不同?即,不只是在旧的良好表达树之上构建代码引用?
谢谢.
Tom*_*cek 21
这两种类型非常相似,但它们的表现方式不同.
报价以更实用的方式设计.例如,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,这非常有用.据我所知,反过来没有翻译.