我想知道这两个特性在实现上有什么区别?也就是说,难道不是只是在旧的表达式树之上构建代码引用吗?
谢谢。
我想知道这两个特性在实现上有什么区别?也就是说,难道不是只是在旧的表达式树之上构建代码引用吗?
谢谢。
foo a b
会被表示为一系列应用程序App(App(foo, a), b)
。
- 引用可以表示一些仅在F#中可用的结构,使用表达式树会隐藏它们。例如,有Expr.LetRecursive
用于let rec
声明.
- 引用最初是在.NET 3.0中引入的。当时,表达式树只能表示C#表达式,因此无法轻松捕获所有F#结构(引用可以捕获任何F#表达式,包括命令式语句)。
- 引用的设计也便于使用递归进行处理。 ExprShape
模块包含的模式允许你只用4个案例就可以处理所有可能的引用(这比在C#中实现拥有数十个方法的访问者模式容易得多)。