对于 Scala 来说,是否存在任何与 LINQ (.NET) 类似的合理的东西?
最佳答案
这取决于“LINQ”的确切含义。 LINQ 涉及很多事情。
最明显的答案是:只需使用 Scala 的 .NET 端口。它使您可以完全 native 访问 .NET 中的所有内容,其中显然包括 LINQ。
不幸的是,Scala 的 .NET 端口几年前就被放弃了。幸运的是,它在几个月前再次获得了微软的直接资助。您预计会在 2011/2012 年的某个时间发布该版本。
无论如何,什么是 LINQ?
在 .NET 中添加了一些功能,特别是针对 LINQ 的 C# 和 VB.NET。从技术上讲,它们不是 LINQ 的一部分,但却是必要的先决条件:类型推断、匿名(结构)类型、lambda 表达式、函数类型( Func<T...>
和 Action<T...>
)和表达式树。所有这些都已经在 Scala 中存在了很长时间,其中大多数已经永远存在了。
也不是 LINQ 的直接一部分,但在 C# 中,LINQ 查询表达式可用于生成 XML,以模拟 VB.NET 的 XML 文本。 Scala 具有 XML 文字,如 VB.NET。
更具体地说,LINQ 是
- 一组标准查询运算符的规范
- 这些运算符的一组实现(即
IQueryable
、LINQ-to-XML、LINQ-to-SQL、LINQ-to-Objects) - 用于 LINQ 查询理解的内置嵌入式语法
- 一个单子(monad)
在 Scala 中,与几乎所有其他函数式语言一样(实际上也几乎所有其他面向对象语言),查询运算符只是标准集合 API 的一部分。在 .NET 中,它们的名称有点奇怪,而在 Scala 中,它们的标准名称与其他语言中的标准名称相同: Select
是 map
, Aggregate
是 reduce
(或fold
),SelectMany
是 flatMap
, Where
是 filter
或withFilter
, orderBy
是 sort
或sortBy
或sortWith
,有zip
, take
和takeWhile
等等。因此,这既考虑了规范又考虑了 LINQ-to-Objects 实现。 Scala 的 XML 库还实现了集合 API,它负责 LINQ-to-XML。
Scala 中没有内置 SQL API,但有第三方 API 实现了集合 API。
Scala 也有针对这些 API 的专门语法,但与 Haskell 不同,Haskell 试图使它们看起来像命令式 C block ,而 C# 则试图使它们看起来像 SQL 查询,Scala 试图使它们看起来像for
循环。他们被称为 for
推导式 相当于 C# 的查询推导式和 Haskell 的 monad 推导式。 (它们还取代了 C# 的 foreach
和生成器 ( yield return
))。
但是,如果您确实想知道 Scala 中是否有 LINQ 的类似物,您首先必须明确“LINQ”的确切含义。 (当然,如果你想知道他们是否“理智”,你也必须对其进行定义。)
关于Scala 中的 LINQ 类似物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785413/