Как они находятся в .Net 3.5. Я знаю, что они в 4.0, как и то, с чем работает DLR, но меня интересует версия, которую мы имеем сейчас.
Полны ли деревья выражений LINQ?
Ответ 1
В раннем проекте спецификации С# 3.0 на полях раздела на деревьях выражений было указано:
У меня есть поистине чудесное доказательство полноты Тьюринга, которая эта граница слишком узкая, чтобы содержать.
К сожалению, никто не смог узнать, кто его написал или разработать доказательство.
Ответ 2
Без определения вещи, которая будет выполнять дерево, мы не знаем. В собственной интерпретации CLR (когда вы их компилируете в делегаты). Но если вы переводите их в SQL, это не так, и вы можете придумать свою собственную путаную интерпретацию их с любыми свойствами, которые вам нравятся.
Пока вы не решили, как их интерпретировать, это всего лишь структуры данных.
Ответ 3
Деревья выражений LINQ могут представлять все, что вы можете поместить в обычное выражение С#. Таким образом, они не могут использоваться для прямого представления циклов while
, циклов for
и т.д.
Однако теоретически возможно использовать лямбда-выражения и рекурсию для выполнения любой итерации, в которой вам может понадобиться. На практике может быть проще отказаться от методов Enumerable
в вашем дереве.
Ответ 4
Хорошо, почему вы не пытаетесь это доказать? Уверен, это забавная задача;)
Но деревья выражений представляют только выражение, и поэтому вам нужно будет определить, что вам разрешено делать, как указано в Earwicker.
Если вы разрешаете деревьям выражений использовать рекурсию, вы можете добиться повторения, т.е. для циклов и т.д.
Тем не менее, нетипизированное лямбда-исчисление является полным Тьюрингом. Turing_completeness # Примеры, но исчисление лямбда не позволяет рекурсии как таковой. Lambda_calculus # Рекурсия все это очень рискованно.
Я бы сделал вывод, что выражение, вероятно, завершено, но для этого потребуется кто-то, кто знаком с этим.