Полны ли деревья выражений LINQ по Тьюрингу?

Как они есть в .Net 3.5. Я знаю, что они в 4.0, так как с этим работает DLR, но меня интересует версия, которая есть у нас сейчас.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
1 306
4

Ответы 4

Деревья выражений LINQ могут представлять все, что вы можете вставить в обычное выражение C#. Таким образом, они не могут использоваться для прямого представления петель while, петель for и т. д.

Однако теоретически можно использовать лямбда-выражения и рекурсию для выполнения любой итерации, которая может вам понадобиться. На практике может быть проще добавить методы Enumerable в ваше дерево.

Деревья выражений LINQ не поддерживают рекурсию, поэтому, похоже, ваш единственный вариант - прибегнуть к боксу и y-комбинатору, который будет очень медленным (выделение на вызов функции).

J D 15.02.2010 21:26

Без определения того, что будет выполнять дерево, мы не знаем. В собственной интерпретации CLR (когда вы компилируете их в делегатов) да. Но если вы переведете их в SQL, это не так, и вы можете придумать свою собственную сбивающую с толку их интерпретацию с любыми свойствами, которые вам нравятся.

Пока вы не решите, как их интерпретировать, это просто структуры данных.

А почему бы тебе не попробовать это доказать? Бьюсь об заклад, это забавный вызов;)

Но деревья выражений представляют собой только выражение, и поэтому вам нужно будет определить, что вам разрешено делать, как заявил Эрвикер.

Если вы разрешите деревьям выражений использовать рекурсию, вы можете добиться повторения, то есть для циклов и т. д.

Однако нетипизированное лямбда-исчисление является полным по Тьюрингу Turing_completeness # Примеры, но лямбда-исчисление не допускает рекурсию как таковую Lambda_calculus # Рекурсия - это все очень рискованно.

Я бы пришел к выводу, что это выражение, вероятно, завершено по Тьюрингу, но для его подтверждения потребуется кто-то, кто более знаком с этим.

Вам не нужно «разрешать» деревьям использовать рекурсию - они уже могут быть: blogs.msdn.com/madst/archive/2007/05/11/…

Marc Gravell 31.03.2009 11:25

В раннем черновике спецификации C# 3.0 на полях раздела о деревьях выражений был комментарий, в котором говорилось:

I have a truly marvellous proof of Turing-completeness which this margin is too narrow to contain.

К сожалению, никому не удалось выяснить, кто это написал, или разработать доказательство.

Надеюсь, это не займет 358 лет. * 8 ')

Mark Booth 16.11.2011 20:11

Им следовало использовать контроль версий и / или Wiki :-p

Péter Török 16.11.2011 20:42

Другие вопросы по теме