F#を使ったクラスライブラリの利用
最後に、.NET Frameworkのクラスライブラリを使用する方法を見ておこう。たとえば、System.Net.WebClientクラスを使用して、インターネットからHTMLのソースコードをダウンロードする処理であれば、次のような記述で済んでしまう。
open System.Net;;
let wc = new WebClient();;
let html = wc.DownloadString "http://www.google.co.jp/";;
printfn "%A" html;;
openというキーワードは、C#でいうimportと同じようなものだ。あとは、WebClientクラスのインスタンスを生成し、DownloadStringメソッドを呼び出しているだけだ。この例を見れば、F#も立派な.NET Frameworkの一員であることがお分かりいただけると思う。
プログラミング言語を使用するときには、言語そのものの仕様だけでなく、どれだけ豊富なクラスライブラリを使用できるかどうかも重要な要素になる。その意味では、.NET Frameworkのクラスライブラリをそのまま使えるため、F#はまったく問題ないと言ってよい。
豊富なクラスライブラリを持つ.NET Frameworkと、関数型言語の強力な機能が両方利用できるF#は、とてつもなく大きな可能性を秘めたプログラミング言語であると言えるのではないだろうか。
C#における動的型付け機能
F#の型推論を見てもらったところで、それと関連してC#における動的型付け機能についても見ておこう。
これまで、C#は一貫して強い型付けにこだわってきた。そして、この強い型付けによって、Visual Studioのインテリセンスなどのサポートによる開発生産性の向上が実現されていた。しかし、Iron PythonやIron Rubyとの連携や、WordやExcelのPIA利用時の煩雑さを軽減させるために、ついに動的型付けがサポートされたのである。
使い方は非常に簡単で、dynamicというキーワードを使用するだけだ。たとえば次のEcho関数は、Nameというプロパティを持っているオブジェクトであれば、どんな変数を渡しても動作する。コンパイル段階では、どんな変数を渡してもエラーにはならない。
void Echo(dynamic person)
{
Console.WriteLine(person.Name);
}
このEchoメソッドを呼び出す場合は、たとえば次のようなコードでもよいわけである。匿名型であろうとなんであろうと、Nameプロパティさえ持っていれば問題ないからだ。
Echo(new { Name = "鈴木" }); //動作
もし、Nameプロパティを持たないオブジェクトが渡された場合は、実行時に「RuntimeBinderException」が発生する。たとえば次のようなコードだ。
Echo(new { Phone = "03-xxxx" });//RuntimeBinderException
dynamicキーワードのおかげで、スクリプト言語との連携や、OfficeのPIA呼び出しがぐっとシンプルに記述出来るようになるというわけだ。
Tupleのサポート
C#において動的型付けがサポートされたが、それは基本的にIronRubyやIronPythonとの連携や、WordやExcelのPIA呼び出しに使用されることを想定している。必要がない限り、強く型付けされたコード上で、Visual Studioのインテリセンスなどの恩恵を受けながらプログラミングをしていった方がよい。その意味で、.NET Framework 4.0から導入されたTuple(タプル)クラスは、従来のC#における改良が目指してきたような、強い型付けと柔軟なコード記述を行うために役立つだろう。
タプルというのは、要するにいくつかの要素の「組」のことである。いくつかの変数をグループ化するという意味では、クラスや構造体と同じ用途で使用されるものだと考えてよい。
クラスベースのオブジェクト指向では、「名前と電話番号と年齢」というような、ちょっとした変数をグループ化しようと思っても、わざわざクラスを定義しなくてはならない、という煩雑さがある。これは非常に面倒である。
もちろん、「object型の要素を扱うList」などを使うことも可能なのだが、そうすると今度は型チェックが利用できなくなってしまう。ということは「intとstringのペア」を期待しているところに「stringとstringのペア」を渡すようなコードを書いても、コンパイル時にエラーを検出することはできなくなってしまうのだ。
そういった煩雑さを解決するために、C# 3.0で匿名型という仕組みが導入された。これはクラスを定義することなく、小さなスコープでのみ有効な一時的なクラスを作成するための機能だ。
たとえば、「名前と電話番号と年齢」とデータの固まりを一時的に使いたいと思った場合は、次のようなコードを記述することができる。
var person = new { Name = "田中", Phone = "03-xxx", Age = 30 };
Console.WriteLine(person.Name);
しかし、匿名型は利用できる場面が限られていて、たとえば直接匿名型を戻り値や引数に直接指定することはできない。先ほど説明したdynamicであれば引数や戻り値にも使うことは可能だが、その場合もやはり型チェックが無効になってしまう。
そこでTupleクラスを使えば、クラスをわざわざ定義することなく戻り値や引数で使う変数をグループ化することができる上に、型チェックの恩恵にも預かれるようになる。
たとえば、「名前と電話番号と年齢」というような「string、string、int」の組み合わせを引数として渡して欲しい場合は、次のような関数を定義すればよいのだ。
void Show(Tuple<string, string, int> person)
{
Console.WriteLine(person.Item1);
}
このShow関数を呼び出す場合は、次のようなコードを記述しなくてはならない。
Show(new Tuple<string, string, int>("田中", "03-xxxx", 30));
もし、「Show(new Tuple