はじめに
この連載では、関数型プログラミングについて、その主な概念と他のパラダイムとの相違、そしてF#がいかにコード記述のスピードアップと結果の生成に貢献するかを解説します。この記事では、駆け足で基礎を習得してから、これまで書いてきたコードとの相関関係について説明します。
こんな昔話があります。ある日、男が王の宮殿を訪れ、自分に答えられない質問はないと豪語しました。誰も男が答えに窮する質問を出せないでいると、王が問いました。あそこにある樹に葉が何枚あるかと。男はほとんど間髪入れず、正確な、かなり大きな数を答えました。しかし、男の答えが正しいかどうかを誰が確認できるでしょうか。いやいや、王と顧問はとても賢かったのです。王はこっそりと召使に命じ、樹から葉を20枚だけ抜き取らせました。そして男に再び、あの樹の葉は何枚あるか、と問いました。今回も男は即座に答えました。最初の答えからちょうど20枚少ない数を。もはや、男を疑う者は1人もいませんでした。
正しい結果を示すアルゴリズムを設計するよりも、仮定の結果を検証するアルゴリズムを設計する方が簡単である――という数学の含蓄が込められたエピソードですが、それは別として、ここから学べる教訓は、常識にとらわれずに、賢明かつ根拠のしっかりした発想を用いることが成功を導く、ということです。関数型プログラミングについても、他のパラダイムと比較したときに、これとまったく同じことが当てはまります。関数型プログラミングは、一握りの単純かつ極めて強力な発想の集合物であり、それぞれの発想は常識から外れた考え方を要求し、忠実な命令型言語プログラマには非常識に見えるものですが、それは適切なツールおよびテクノロジと結び付くことで新しい世界を開き、比類なき生産性を生み出すものなのです。
2008年2月、MicrosoftのSVP(Developer Division)であるS. Somasegar氏は、Microsoftの新しい関数型プログラミング言語F#が.NET生態系の第一級市民となり、Visual Studioの一言語として完全にサポートされると発表しました。この単純かつ強力な概念のシナジー、適切なプラットフォームと豊富なツール、そしてテクノロジの融合は、多くの開発者の目を開かせました。Microsoftの発表を境にF#は知名度を増し、プロフェッショナルの開発者から一躍注目されるようになったのです。
F#とは
F#は、SMLやOCamlといった、多くの大学・研究機関で利用されているがそれ以外のシーンはほぼ無名のMLでファミリ言語と同じルーツを持ちますが、Cambridge Microsoft Researchラボで2002年にDon Syme氏の指揮のもとに生まれて以来、歩んできた道は異なります。Don Syme氏は、.NETジェネリックの主要デザイナの1人であり、Microsoftプログラミング言語研究活動における中心的存在です。
F#は、関数型のオブジェクト指向言語であり、コンパイルしたコードは共通言語ランタイム(CLR)で実行されます。コンパクトかつ強力な関数型コア言語を基盤とし、他の.NET言語とシームレスに連携して機能する完全なオブジェクト指向拡張セットを備えます。F#は、動的言語の高い表現力と静的な型付け言語のパワーを兼ね備えています。ポリモーフィックであろうとなかろうと、F#のすべての値は強く型付けされたデータ型です。強力な型付けシステム(プログラムを実行する前にコンパイラによって型付けのエラーが指摘される)と型推論(コードにデータ型を書き添える必要はない)を併せ持つことから、 F#コードは他の.NET言語のコードよりも短く洗練されており、読解、保守、拡張が容易です。
F#では、低レベルの制御が必要であれば命令型プログラミングのコードも記述できます。しかし、関数型の思考に慣れてしまうと、命令型はほとんど使わなくなり、関数型でコードをより抽象的に記述する方法の威力を認めるようになるでしょう。この記事では、関数型およびオブジェクト指向の機能のみを見ていきます。
F#の概要
F#には2つの動作モードがあります。伝統的な標準構文を使うモードと、使用するキーワードの数が少なく、インデントが示すスコープに基づいて特定の書式ルールを強制する、より簡略化された構文を使うモードです。後者は#lightモードと呼ばれ、一般にプログラムファイルの1行目に#lightと記述することで有効になります。以降では、リスト1のように#lightが有効になっていることを前提として説明を進めます。
F#には、F# Interactiveという非常に便利なツールが付属しています。F# Interactiveは、スタンドアロンのプログラム(fsi.exe)またはVisual Studioアドイン(図1を参照)として使用できる最上位ループです。アドイン版を使うには、最初にアドインを有効にしてから、F#コードの目的の部分を強調表示し、Altキーを押しながらEnterキーを押してその部分をF# Interactiveに送信します。アドインに送信したコードはその場で解析、コンパイル、評価されます。戻り値とそのデータ型を簡単に確認できます。このような対話型のセッションでコードを部分的にテストできるため、任意の式を入力するなどの方法で動的にF# Interactiveと対話できます。
また、コード補完機能(Tabキーを押して呼び出す)を使うと、使用可能な他のコードをいつでも表示できます。対話型セッションで、>で始まるコマンドラインからコードを直接入力する場合、セミコロンを2つ続けて入力すると、コードブロックを閉じることができます。入力したブロックは対話型セッションに送信され、エラーメッセージが表示されるか、値のバインディングとデータ型が返されます。