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