Pull to refresh

Нововведения F# 3.0

Reading time4 min
Views3K
На прошедшей недавно конференции Build кроме уже широко освещенной и обсужденной презентации Windows 8, Metro UI и WinRT было еще немало интересного. В том числе, Дон Сайм и его команда представили developer preview новой, третьей по счету, версии языка программирования F#, который является частью developer preview Visual Studio 11 (и, кстати, уже может быть опробована вами по ссылке).


F# (впрочем как и многие другие функциональные языки), является достаточно мощным, лаконичным и выразительным языком программирования и позволяет зачастую решать сложные задачи с помощью достаточно простого и короткого кода. Он уже нашел применение в некоторых областях, в том числе в финансовых программах, программах для трейдинга, анализа данных, научных исследований и других. И хотя, конечно, по популярности он сильно отстает от своего старшего собрата C# (а боюсь, и от младшего — VB), но все-таки некоторое распространение получил, и умирать пока не собирается.

Новая версия языка является логичным и последовательным развитием его в направлении еще большей лаконичности и декларативности. Среди главных нововведений языка можно отметить LINQ запросы, Type Providers, а также набор встроенных провайдеров типов для имеющихся в данный момент энтерпрайз и веб-стандартов поставки данных. Все эти нововведения служат одной цели — упрощения работы с данными и их доступности. Они являются частью новой концепции, которую разработчики языка назвали Information Rich Programming (IRP). Разберем эти нововведения подробнее, и посмотрим, как они работают вместе.

Type Providers


Механизм провайдеров типов (Type Providers) является ключевой частью коцепции IRP.
Одним из важнейших условий на пути к IRP разработчики языка видят необходимость представления информации из внешних источников в виде типов, свойств и методов для использования в среде языка программирования. Написание этих типов руками отнимает много времени, сил и затем все это сложно поддерживать. Одной из обычных альтернатив является использование кодогенераторов, которые добавляют необходимые файлы в проект. Однако это не соответствует исследовательским способам программирования, которые поддерживает F#, потому что при каждом новом подключении к сервису данных необходимо менять сгенерированные файлы.

Именно здесь на помощь приходит провайдер типов, компонент, который включает в программу новые типы и методы, основанные на схемах данных из внешних источников данных. Типы, предоставляемые провайдерами типов обычно основываются на внешних информационных источниках. Например, уже встроенный в дистрибутив F# провайдер типов для SQL будет предоставлять типы и методы, которые позволят программисту работать прямо с таблицами любой SQL базы данных. Схожим образом работает провайдер типов для WSDL.

Типы и методы, предоставляемые провайдером, могут зависеть от параметров, определенных в коде или конфигурационных файлах. Например, тип провайдера может предоставлять разные типы в зависимости от строки подключения к БД или URL веб-сервиса. Также провайдер типов может предоставлять и раскрывать различные группы данных только по требованию, т.е. они раскрываются только если эти типы в данный момент требуются вашей программе, что позволяет интегрировать в программу большие потенциально объемы данных, такие как онлайн-магазины.
Кроме уже упоминавшихся провайдеров типов для SQL и WSDL, встроен также провайдер для OData. Кроме того, программист может написать свой собственный провайдер типов.
Посмотрим теперь, как это работает, на примере встроенного провайдера типов для SQL:


Атрибут Generate определяет класс провайдера типов. Нам достаточно прописать строку инициализации, получить контекст данных, и, voila, уже в следующей строке нашего скрипта (отметьте, это именно скриптовый файл fsx) мы имеем доступ к таблицам БД в том числе с поддержкой IntelliSense.

Как можно видеть, все это действительно очень просто и удобно. Но для SQL уже столько было всяческих ORM'ов и всего прочего, что возможно это и не поражает воображение. Тогда взглянем на провайдер для доступ к OData. Например, известно, что ebay позволяет получать доступ к своим лотам с помощью OData. Давайте подключимся к этому сервису и удостоверимся, что все работает.

Как видим, все хорошо, IntelliSense в скриптовом файле автоматически подцепил структуру данных магазина, и все готово, чтобы этими данными воспользоваться.

LINQ Queries


Итак, у нас есть строго типизированные программные отображения внешних хранилищ данных, и это прекрасно. Но теперь нам бы хотелось легко и просто делать по ним выборки. Как? Конечно с помощью LINQ, ставшего вторым нововведением F#, поддерживающим концепцию IRP.
Реализуется оно с помощью Query expressions, нового вида computation expression с ключевым словом query. (Если вы забыли, что такое вычислительные выражения, они же computation expressions, добро пожаловать сюда, если же вам лень, то скажу просто, что это по сути реализация монад в F# со всеми причитающимися Bind'ами и Do'ми).

По синтаксису эти запросы схожи со своими C# аналогами, с ключевыми словами select, where, count, и.т.п. (полный список можно найти на MSDN). Ну и сразу небольшой пример кода, чтобы сразу стало ясно. Здесь мы, ради интереса, подключимся к OData поставщику от stackoverflow.com:



В результате выполнения этого скрипта в F# Interactive получим следующий результат:



Естественно, запросы могут быть практически неограниченной сложности и глубины.

На мой взгляд, связка Type Providers + Queries достаточно любопытна и, возможно, «взлетит». Будем ждать в ближайшее время пополнения коллекции провайдеров от сторонних разработчиков (например, интересно было бы посмотреть на провайдер для NoSQL). Посмотрим, куда заведет анонсированный IRP-way разработчиков дальше.

Отмечу также, что кроме двух главных нововведений, будут еще небольшие улучшения, например, введение автогенерируемых свойств, как в C#:
type MyClass(property : int) =
  member val AutoProperty = property with get, set



Ну и, наконец, нас ждут заметные улучшения и в интеграции F# с Visual Studio, в том числе улучшенный IntelliSense (а вы помните выпуск VS без этой killer-feature «Improved IntelliSense»? :)), поиск, подсказки и предупреждения.

Спасибо за внимание!
Tags:
Hubs:
+38
Comments8

Articles

Change theme settings