LINQ:为什么它被称为“Comprehension Syntax”?

20
为什么以下的LINQ语法(有时称为“查询”语法)被称为“理解”语法?它是在理解什么(这肯定是错误的)?还是,它是如何被全面地表示的(也许我现在走在了正确的轨道上)?


2
相关:http://zh.wikipedia.org/wiki/列表生成式 - Marc Gravell
5个回答

18
它来自更通用的术语List Comprehension,许多语言都遵循这种形式。历史上,SETL编程语言(1960年代晚期)有一个集合构建结构,计算机代数系统AXIOM(1973年)也有一个类似处理流的结构,但是 “comprehension”一词最早用于Rod Burstall和John Darlington描述的函数式编程语言NPL, 该语言出现在1977年。FOLDOC大多也是如此。根据Rishiyur Nikhil的注释,该术语本身似乎是由Phil Wadler在1983-5年左右创造的,尽管编程结构本身的历史要久远得多(最可能是Jack Schwartz和SETL语言)。“列表理解”一词出现在下面的参考资料中。符号的最早参考文献是Rod Burstall和John Darlington对他们的语言NPL的描述。

我看了你(和马克)引用的维基百科文章,但我仍然不明白为什么它被称为那样(到目前为止,你的答案似乎主要谈论自从何时它被称为那样)。这篇维基百科文章是否相关?它被称为“理解”语法,是因为查询的所有内容都在一起定义(与LINQ扩展方法相反,后者将查询分块定义)吗? - lance
3
@lance - 因为它必须被称作某个东西 ;p 有时事情就是这么简单... - Marc Gravell
@lance,这就是为什么我包含了FOLDOC参考列表的原因,因为它们提到了一些实际的来源名称。如果这些来源中没有任何理由或解释,那么就像Marc所说的那样 - "之所以这样称呼它,是因为它一直被称为这个名字"。 - Daniel DiPaolo

6
我怀疑这与理解的第二个意思有关:

包含或涵盖;包括

这种语法与定义集合中应包含什么有关。

1
丹尼尔的回答给了我一些很好的阅读材料,但我决定接受马蒂亚斯的答案。丹尼尔的回答更多地涉及“理解”这个术语的历史,而马蒂亚斯非常简单的观点清楚地表明了该术语与其次要定义“包含”的关联,这是“列表理解”的核心思想:从一个集合或列表中取出并包含在另一个中。 - lance

1

我认为这篇论文可以启发一些思路http://dl.acm.org/citation.cfm?id=181564。他们(我认为)论证和定义了什么是理解语法。这篇文章发表于1994年,可能影响了LINQ的设计概念。


0
由于“comprehension”和“comprehensive”这个词在英语中经常用来表示“整体”和“完整性”,因此理解语法的一种含义可以是一种能够生成值集合的表达式的语法,这些值“包括所有值”(理解)并遵守这些表达式所表达的规则。
另一个意义可能更与从某个指定集合开始生成值的子集(列表)有关,因此属于起始集合且“包含”在原始集合中的值的子集。因此,理解语法可以是编程语言结构的语法,这些语法可以生成包含在指定原始集合中的子集值。

1
你知道吗?你可以编辑你现有的答案,而不是写第二个答案。 - Rawling

0
作为一名.NET开发人员,我对linq推导语法的理解是它允许你使用熟悉的查询语言风格编写linq。随着对linq的理解加深,人们可能会转向在.NET中称为扩展方法语法的方式,这也是.NET编译器在编译时将解释linq的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接