Интересно, есть ли разница в том, как две функции реализованы под капотом? То есть Не только кодовые цитаты, построенные поверх старых хороших деревьев выражений?
Спасибо.
Ответ 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 #. Насколько я знаю, нет перевода другим способом.