イノベーションF#3.0

最近のBuildカンファレンスでは、すでに広く取り上げられ議論されているWindows 8、Metro UI、WinRTのプレゼンテーションに加えて、さらに多くの興味深いことがありました。 特に、Don Symeと彼のチームは、Visual Studio 11の開発者プレビューの一部であるF#プログラミング言語の新しい第3バージョンの開発者プレビューを導入しました(ところで、 ここで既に試してみることができます )。





F#(および他の多くの関数型言語)は、かなり強力で簡潔で表現力豊かなプログラミング言語であり、多くの場合、かなり単純で短いコードを使用して複雑な問題を解決できます。 金融プログラム、取引プログラム、データ分析、研究などを含むいくつかの分野ですでにアプリケーションを発見しています。 もちろん、人気はあるものの、兄のC#(そして、私は、VBの弟から)に大きく遅れをとっていますが、それでもある程度の分布を受けており、まだ死ぬことはありません。



この言語の新しいバージョンは、さらに簡潔で宣言的な方向への論理的で一貫した開発です。 この言語の主な革新には、LINQクエリ、タイププロバイダー、および現在利用可能なエンタープライズ向けの組み込みタイププロバイダーのセットおよびデータ配信用のWeb標準があります。 これらのイノベーションはすべて、1つの目的に役立ちます-データを扱う作業とそのアクセシビリティの簡素化です。 これらは、言語開発者がInformation Rich Programming(IRP)と呼んでいる新しい概念の一部です。 これらのイノベーションをより詳細に分析し、それらがどのように連携するかを確認します。



タイププロバイダー



タイププロバイダーは、IRPコンセプトの重要な部分です。

IRPへの道の最も重要な条件の1つである言語開発者は、外部ソースからの情報を、プログラミング言語環境で使用するための型、プロパティ、およびメソッドの形式で提示する必要があると考えています。 これらのタイプを手で書くには多くの時間と労力がかかり、それを維持することはすべて困難です。 通常の代替手段の1つは、必要なファイルをプロジェクトに追加するコードジェネレーターを使用することです。 ただし、これは、データサービスへの新しい接続ごとに、生成されたファイルを変更する必要があるため、F#がサポートする研究プログラミング手法に対応していません。



ここで、外部データソースからのデータスキームに基づいた新しいタイプとメソッドを含むコンポーネントであるタイププロバイダーが助けになります。 タイププロバイダーによって提供されるタイプは、通常、外部情報ソースに基づいています。 たとえば、F#ディストリビューションに既に組み込まれているSQLの型プロバイダーは、プログラマーが任意のSQLデータベースのテーブルを直接操作できるようにする型とメソッドを提供します。 WSDLの型プロバイダーも同様に機能します。



プロバイダーが提供するタイプとメソッドは、コードまたは構成ファイルで定義されているパラメーターに依存する場合があります。 たとえば、プロバイダーのタイプは、データベースへの接続文字列またはWebサービスのURLに応じて異なるタイプを提供する場合があります。 また、タイププロバイダーは、オンデマンドでのみデータのさまざまなグループを提供および開示できます。 これらのタイプが現在プログラムで必要とされている場合にのみ公開されます。これにより、オンラインストアなど、潜在的に大量のデータをプログラムに統合できます。

前述のSQLおよびWSDLの型プロバイダーに加えて、ODataのプロバイダーも組み込まれています。 さらに、プログラマーは独自の型プロバイダーを作成できます。

次に、SQLの組み込み型プロバイダーを例として使用して、これがどのように機能するかを見てみましょう。





Generate属性は、タイププロバイダークラスを定義します。 初期化文字列を登録し、データコンテキストを取得し、スクリプトの次の行(注、これはfsxスクリプトファイルです)で、IntelliSenseサポートを含むデータベーステーブルにアクセスできれば十分です。



ご覧のとおり、これらはすべて非常にシンプルで便利です。 しかし、SQLについては、すでに非常に多くの種類のORMおよびその他すべてが存在しているため、驚くことではありません。 次に、ODataにアクセスするためのプロバイダーを見てください。 たとえば、ebayではODataを使用してロットにアクセスできることが知られています。 このサービスに接続して、すべてが機能することを確認しましょう。



ご覧のとおり、すべてが正常であり、スクリプトファイルのIntelliSenseが自動的にストアデータ構造を取得し、すべてがこのデータを使用する準備ができています。



LINQクエリ



したがって、外部データストレージのプログラムマッピングを厳密に型指定しており、それで問題ありません。 しかし、今、私たちはそれらを簡単かつ簡単に選択したいと思います。 どうやって? もちろん、F#の2番目のイノベーションとなったLINQの助けを借りて、IRPの概念をサポートしています。

クエリキーワードを使用した新しい種類の計算式であるクエリ式を使用して実装されます。 (計算式が何であるかを忘れた場合、それらは計算式です 。もしあなたが怠け者なら、これは本質的にF#でのすべてのBindとDoを伴うモナドの実装です)



構文では、これらのリクエストは、キーワードselect、where、countなどを含むC#の対応するリクエストに似ています。 (完全なリストはMSDNで見つけることができます)。 まあ、すぐに、すぐにそれを明確にする小さなサンプルコード。 ここでは、興味のために、stackoverflow.comからODataプロバイダーに接続します。







F#Interactiveでこのスクリプトを実行した結果、次の結果が得られます。







当然、リクエストの複雑さと深さはほぼ無限です。



私の意見では、Type Providers + Queriesの束は非常に好奇心が強く、恐らく離陸するでしょう。 近い将来、サードパーティの開発者からのプロバイダーのコレクションを待ちます(たとえば、NoSQLのプロバイダーを見るのは面白いでしょう)。 アナウンスされた開発者のIRPウェイがさらに先に進む場所を見てみましょう。



また、2つの主要な革新に加えて、C#のように自動生成プロパティの導入など、小さな改善があることにも注意してください。

type MyClass(property : int) =

member val AutoProperty = property with get, set










そして最後に、改善されたIntelliSense(このキラー機能「Improved IntelliSense」のないVSリリースを覚えていますか?))、検索、ヒント、警告など、F#Visual Studioとの統合に顕著な改善が見られます。



ご清聴ありがとうございました!



All Articles