関数型プログラミング言語F#

前回はASP.NET AJAXにおける追加機能を見たので、今回はプログラミング言語における新機能について見てみよう。

まずはVB、C++、C#に加えて、Visual Studio 2010から新しく加わったプログラミング言語F#を取り上げる。F#は関数型言語のOCaml(Objective Caml、オキャムル)と似た構文を持つプログラミング言語である。

関数型言語というとLispやHaskellなどが有名だが、使ったことがある人はそれほど多くはないかもしれない。わざわざ新しいプログラミング言語を学習しなくても、今使っているプログラミング言語で十分だ、と考える人の方が多いだろう。

しかし、C#に取り入れられた匿名デリゲートやラムダ式などは、確実に関数型言語の影響を受けているし、Ajaxの普及とともに利用者が増えてきたJavaScriptも、関数型言語のエッセンスを大いに取り入れている。そういった意味では、関数型言語は今非常にホットだと言えるのだ。

また、.NET Frameworkの特性上、さまざまな言語を組み合わせてシステム開発を行うことができる。ということは、F#で開発したDLLをC#から呼び出すこともできるのだ。そのため、特定のコンポーネントだけをF#で開発する、というような使い方もできるわけである。

C#やVBとはまったくパラダイムが異なる言語なので、初めは違和感を覚えるかもしれないが、ぜひ一度F#を触ってみることをおすすめする。もしF#を使いこなすことができなかったとしても、本格的な関数型言語に触れておくことは、C#やJavaScriptをより深く理解するためにも必ず役立つからだ。

F#の基本文法

それでは、F#でのサンプルプログラムを少しだけ見てみることにしよう。

VS 2010でF#のプロジェクトを作成する場合は、VBやC#でプロジェクトを作る場合と同じように、メニューの[ファイル]-[新規作成]-[プロジェクト]をクリックし、「Visual F#」の「F# Application」を選択すればよい。

メニューの[ファイル]-[新規作成]-[プロジェクト]から「Visual F#」の「F# Application」を選択

では、まずお決まりのHello Worldから作成してみよう。記述するコードは次のようになる。

let s = "Hello";;
printfn "%A" s;;

コードを記述したら、メニューの[デバッグ]-[デバッグなしで開始]をクリックすれば、ビルドが行われ、「Hello」という結果が表示される。

ここで行っているのは、変数への代入(束縛)と関数の呼び出しという最も基本的な処理である。

まず、変数への代入は「let」というキーワードを使用して「let 変数名 = 値」というように記述する。また、関数へ引数を渡すときにはカッコは使わない。「関数名 引数1 引数2...」という呼び出し方になる。そして、printfnというのはF#におけるprintfのような関数である。

つまりこのプログラムは、「変数sにHelloという文字列を代入した後、変数sの値を表示する」という意味になる。また、命令文の区切りには「;;」を使用する(注:ただし「;;」を使用しなくても文の区切りだと認識してくれるケースもある)。

ここまで見ると、まずVBやC#とは2つの点で大きく異なることが分かるだろう。

まず1点目の違いはクラスを必ずしも必要としないことである。もちろんF#でもクラスは利用可能だが、トップレベルがクラスでなければならないという制約はない。そういった意味ではRubyやPythonのようなスクリプト言語に近いとも言えるだろう。

2点目の違いは「変数の型」の扱いである。「let s = "Hello";;」という命令文を見る限りでは、どこにも変数の型が指定されてない。そのため、ぱっと見た感じでは動的型付けをしているように思われるかもしれない。

しかし、F#は動的型付けの言語ではない。F#上では、変数sはstring型の変数と扱われている。後ほどもう少し詳しく見るが、これが「型推論」という仕組みである。型推論のおかげで、強い型付けのメリットを享受しつつ、簡潔なソースコードで済ませることができるのだ。型推論は、F#における主要な特徴の1つと言えるだろう。