【发布时间】:2010-09-20 00:08:51
【问题描述】:
就像它们在 .Net 3.5 中一样。我知道它们是 4.0,因为这是 DLR 使用的,但我对我们现在拥有的版本感兴趣。
【问题讨论】:
标签: .net linq expression-trees dynamic-language-runtime turing-complete
就像它们在 .Net 3.5 中一样。我知道它们是 4.0,因为这是 DLR 使用的,但我对我们现在拥有的版本感兴趣。
【问题讨论】:
标签: .net linq expression-trees dynamic-language-runtime turing-complete
LINQ 表达式树可以表示您可以放入普通 C# 表达式中的任何内容。因此,它们不能用于直接表示while 循环、for 循环等。
但是,理论上可以使用 lambda 表达式和递归来执行您可能需要的任何迭代。在实践中,将 Enumerable 方法放入树中可能更容易。
【讨论】:
如果不定义将执行树的东西,我们不知道。在 CLR 自己的解释中(当您将它们编译为委托时)它们是。但是如果你将它们翻译成 SQL,它们就不是,你可以用你喜欢的任何属性来创造你自己的令人困惑的解释。
在您决定如何解释它们之前,它们只是数据结构。
【讨论】:
好吧,你为什么不尝试证明呢?我敢打赌这是一个有趣的挑战;)
但表达式树仅代表一个表达式,因此您必须定义允许执行的操作,如 Earwicker 所述。
如果您允许表达式树使用递归,您可以实现重复,即 for 循环等。
然而,无类型的 lambda 演算是图灵完备的 Turing_completeness#Examples 但 Lambda 演算本身不允许递归 Lambda_calculus#Recursion 这一切都很冒险。
我会得出结论,表达式可能是图灵完备的,但需要对此更熟悉的人来确认。
【讨论】:
在 C# 3.0 规范的早期草案中,表达式树部分的边缘有一条评论说:
我有一个非常了不起的图灵完备性证明,这个边距太窄而无法包含。
遗憾的是,没有人能够找出是谁写的或开发证明。
【讨论】: