Ответ 1
Два типа довольно похожи, но они представлены по-разному.
-
Котировки разработаны более функционально. Например,
foo a b
будет представлен в виде серии приложенийApp(App(foo, a), b)
-
Котировки могут представлять некоторые конструкции, доступные только в F #, и использование деревьев выражений скроет их. Например, есть
Expr.LetRecursive
для объявленийlet rec
-
Котировки были впервые представлены в .NET 3.0. В то время деревья выражений могли представлять только выражения С#, поэтому было невозможно легко захватить все конструкции F # (цитаты могут захватывать любое выражение F #, включая императивные).
-
Котировки также предназначены для легкой обработки с использованием рекурсии. Модуль
ExprShape
содержит шаблоны, которые позволяют обрабатывать все возможные цитаты всего за 4 случая (что намного проще, чем реализация шаблона посетителя с десятками методов на С#).
Когда у вас есть цитата из F #, вы можете перевести ее в дерево выражений С#, используя FSharp.Quotations.Evaluator. Это очень полезно, если вы используете некоторый .NET API, который ожидает, что деревья выражений из F #. Насколько я знаю, нет перевода другим способом.