2011-11-15 31 views

回答

20

這兩種類型非常相似,但它們的表現方式不同。

  • 報價設計的功能更強大。例如,foo a b將表示爲一系列應用程序App(App(foo, a), b)

  • 引用可以表示一些只在F#中可用的構造,並且使用表達式樹可以隱藏它們。例如let rec聲明有Expr.LetRecursive

  • 語句首次在.NET 3.0中引入。當時表達式樹只能表示C#表達式,因此無法輕鬆捕獲所有F#結構(引用可以捕獲任何F#表達式,包括命令式表達式)。

  • 報價也被設計成使用遞歸很容易處理。 ExprShape模塊包含的模式允許您僅處理4種情況下的所有可能的引用(這比在C#中使用數十種方法實現訪問者模式要容易得多)。

當你有一個F#報價,則可以使用FSharp.Quotations.Evaluator轉換成C#表達式樹。如果您使用某些預計來自F#的表達式樹的.NET API,這非常有用。據我所知,沒有任何翻譯相反。