LINQ表达式树是否完整?

时间:2008-10-30 14:37:16

标签: .net linq expression-trees dynamic-language-runtime turing-complete

他们在.Net 3.5中。我知道他们在4.0中,因为这是DLR的工作方式,但我对我们现在拥有的版本感兴趣。

4 个答案:

答案 0 :(得分:21)

在C#3.0规范的早期草案中,表达树的部分边缘有一条评论说:

  

我有一个关于图灵完整性的真正奇妙的证据,这个边缘太窄而无法包含。

可悲的是,没有人能够找出是谁写的或开发证据。

答案 1 :(得分:4)

如果没有定义将执行树的东西,我们不知道。在CLR自己的解释中(当你将它们编译成代表时)它们是。但是如果你将它们翻译成SQL,它们就不是,你可以用你喜欢的任何属性发明你自己对它们的混淆解释。

在你决定如何解释它们之前,它们只是数据结构。

答案 2 :(得分:2)

LINQ表达式树可以表示您可以放在普通C#表达式中的任何内容。因此,它们不能用于直接表示while循环,for循环等。

但是,理论上可以使用lambda表达式和递归来执行您可能需要的任何迭代。在实践中,将Enumerable方法放入树中可能更容易。

答案 3 :(得分:1)

嗯,你为什么不试着去证明呢?我敢打赌这是一个有趣的挑战;)

但是,表达树只代表一个表达式,因此你必须定义你允许做什么,如Earwicker所述。

如果允许表达式树使用递归,则可以实现重复,即循环等。

然而,无类型的lambda演算是Turing-complete Turing_completeness#例子但是Lambda演算本身不允许递归Lambda_calculus #Recursion它都非常冒险。

我会得出结论,表达可能是图灵完成的,但需要有更熟悉这一点的人才能确认。