Это зависит от того, что именно вы подразумеваете под «LINQ». LINQ это много вещей.
Самый очевидный ответ: просто используйте порт .NET Scala. Это дает вам полный собственный доступ ко всему в .NET, который, очевидно, включает в себя LINQ.
К сожалению, .NET-порт Scala был удален пару лет назад. К счастью, его снова взяли пару месяцев назад при официальном финансировании напрямую от Microsoft. Вы можете ожидать релиз в какое-то время в 2011/2012 гг.
В любом случае, что такое LINQ?
Пара функций, добавленных в .NET и, в частности, C # и VB.NET для LINQ. Технически они не являются частью LINQ, но являются необходимыми предварительными условиями: вывод типов, анонимные (структурные) типы, лямбда-выражения, типы функций (Func<T...>
и Action<T...>
) и деревья выражений. Все это было в Скале в течение длительного времени, большинство из них были там навсегда.
Также не напрямую в LINQ, но в C # выражения запросов LINQ могут использоваться для генерации XML, чтобы эмулировать литералы XML VB.NET. Scala имеет XML-литералы, такие как VB.NET.
Более конкретно, LINQ - это
- спецификация для набора стандартных операторов запросов
- набор реализаций для этих операторов (то есть
IQueryable
, LINQ-to-XML, LINQ-to-SQL, LINQ-to-Objects)
- встроенный встроенный синтаксис для понимания запросов LINQ
- монада
В Scala, как и почти во всех других функциональных языках (и, фактически, также почти во всех других объектно-ориентированных языках), операторы запросов просто являются частью стандартного API коллекций. В .NET они имеют немного странные имена, тогда как в Scala они имеют те же стандартные имена, что и в других языках: Select
- это map
, Aggregate
- это reduce
(или fold
), SelectMany
это flatMap
, Where
это filter
или withFilter
, orderBy
это sort
или sortBy
или sortWith
, и есть zip
, take
и takeWhile
и так далее. Таким образом, это заботится как о спецификации, так и о реализации LINQ-to-Objects. XML-библиотеки Scala также реализуют API коллекций, которые заботятся о LINQ-to-XML.
API-интерфейсы SQL не встроены в Scala, но существуют сторонние API-интерфейсы, которые реализуют API коллекции.
Scala также имеет специализированный синтаксис для этих API, но в отличие от Haskell, который пытается сделать их похожими на императивные блоки C и C #, который пытается сделать их похожими на запросы SQL, Scala пытается сделать их похожими на циклы for
, Они называются for
понимания и являются эквивалентом понимания запросов C # и понимания монадами Хаскелла. (Они также заменяют C # foreach
и генераторы (yield return
)).
Но если вы действительно хотите знать, есть ли аналоги для LINQ в Scala, вам сначала нужно будет уточнить, что именно вы подразумеваете под "LINQ". (И, конечно, если вы хотите знать, являются ли они «вменяемыми», вам также придется это определить.)