Table of Contents
2009/10/22 Visual Studio 2010 beta2がリリースされました!F#の言語仕様もバージョンアップしているため、それを踏まえてこれからページ全体を見直し中です。そのため、説明が古かったりうまくコンパイルできない箇所があるので注意してください。
2008年の年末に行われたMicrosoftのイベントにおいて、F#がVisual Studio 2010に搭載されるという発表があってから約半年、Visual Studio 2010 beta 1にF#が標準搭載されました。ところが現在F#を勉強してみようと思っても、あまり多くの情報は手に入りません。とくに体系的に説明されたサイトとなるとほとんどないのが現状です。現在のところ体系的な説明のある資料は、書籍ではF#の言語設計者でありC#のジェネリックの設計者でもあるDon Symeの書いた「Expert F#」、F#のエヴァンジェリストであるRobert Pickeringの書いた「Foundations of F#」といった2冊と、Web上ではWikibooksのF Sharp Programmingくらいでしょうか。また、国内でもまだまだ数は少ないのですが、いげ太さんやdeko_ponさんなどが積極的に情報を発信されています。
この中でもExpert F#は大変評価の高い良書であり、現在のF#のバイブルとなっています。しかし、それなりの値段がする上に分厚い洋書であるため、少し敷居の高いものとなっています。また、大半の解説は丁寧なのですが、一部わかりにくいところがあります。特にオブジェクト指向の章の解説は大雑把な感があります。さらに、この書籍をじっくり読みこなそうと思うと関数型プログラミングの知識が欠かせません。書籍自体は、関数型プログラミングを知らない人でも読めるように配慮されてはいますが、深い理解をするにはその前提知識がないと読みこなすのは難しいでしょう。
そこでこのサイトは、今まで関数型プログラミングに触れたことのない人でも読めるように、F#の基礎と同時に関数型プログラミングの基礎について体系的に解説します。読者としては、C#と.NET Frameworkをある程度理解している方を対象としています。
全体は2部で構成されており、第1部でF#の基礎的な言語仕様に関して解説したあとに、第2部で高度な言語仕様について解説します。F#の特徴的な機能であるワークフローについては第2部で扱います。
少し断っておきますと、現時点で第1部はほぼ完成しているのですが、第2部はまだあまり執筆できていません。F#の先進的な言語仕様の奥底を知ろうとすると、そこには非常に深淵な世界が広がっており、私の矮小な脳ではなかなか歯が立たずに苦労しています。特にワークフローという機能は、純粋関数型言語Haskellのモナドという概念と密接な関係があり、私もまだ完全に理解しきれていません。ですので、第2部の執筆がなかなか進まなくてもご容赦ください。
また、このサイトに関するご意見も募集中です。ここの解説をもっと丁寧にしてほしいといった意見や、逆にここの解説方法がわかりやすかったといった意見をいただければ、今後のサイト作りの参考にしたいと思いますので、気軽にメールをください。可能な限りお答えしたいと思います。
このサイトでは、文法の表現に以下の記法を用います。
表記 | 意味 | 例 |
---|---|---|
太字 | F#のキーワード(終端記号) | class, let, match |
色付き太字 | プログラマによって記述される箇所(非終端記号) | class-name ,
params ,
types |
[] | 括弧内は省略可能 | if expr then
expr1 [else
expr2 ] |
[]* | 括弧内の0回以上の繰り返し | [type-defn ]*,
[inherit
class-name ]* |
[]+ | 括弧内の1回以上の繰り返し | [let-binding ]+,
[open
namespace ]+ |
[x|y] | xまたはy | [function-def|value-def] |
プログラミング言語を確実に習得するには、概念を学んだあとに実際にコードを書いてみることが重要です。このサイトでは、解説のあとに簡単な練習問題を織り込むことで理解を補おうと考えています。ただしまだ全体が書きかけなこともあって、問題が用意できていない部分が多々あると思いますが、なるべく充実させたいと思います。
まずはF#の開発環境の導入方法と、本文中のサンプルを実行する方法を説明します。そして、F#の雰囲気をつかむのと同時に開発環境になじんでもらうために、チュートリアル形式でF#に簡単に触れます。
F#の基本的な型と、それらに対して定義されている演算を一通り紹介します。章の最後では、識別子について説明します。
もっとも基本的な構文である逐次実行文と条件文の説明したあとに、関数型言語の特徴であるmatch式とパターンマッチについて説明します。
関数型言語の中核をなす関数の扱いについて説明します。ここでは「部分適用」「カリー化」といった重要な概念について説明します。後半では関数型言語は、ループの表現にforループではなく再帰呼び出しを使うことを説明します。そして最後に、無名関数であるラムダ式について説明をします。
関数型言語では、関数自体を「関数値」というひとつの値として扱うことができ、通常の値と同じように関数の引数として受け取ったり戻り値として返したりすることができます。このように関数値をやりとりする関数は「高階関数」と呼ばれ、関数型プログラミングでは非常によく利用されます。
またこの章の中盤では、関数値のひとつである「クロージャ」の説明をします。クロージャは、高階関数との組み合わせにより驚異的な表現力を持つようになります。
後半では型推論という概念を説明します。型推論は、変数の型名を記述しなくてもまわりの状況から型を自動的に推論してくれる機能です。F#では型推論を積極的に利用し、基本的に型名の記述は省略します。また、これは.NET Frameworkにおけるジェネリックとも密接に関係しています。ここではそれらの関係について説明します。
F#は関数型プログラミング言語ですが、その一方で命令型プログラミングもサポートしています。記述するプログラムによっては、関数型よりも命令型によるプログラミングのほうが適している場合があり、F#では場合によってそれらを使い分けることができます。ここでは、それらの命令型プログラミングの手法について説明します。
オブジェクト指向プログラミングは関数型プログラミングとは相反するパラダイムではなく、これらはうまく組み合わせることができます。また、F#から.NET Frameworkのライブラリを利用するときにも、F#におけるオブジェクト指向プログラミングの方法を知っている必要があります。
F#には、クラス定義やインスタンスの生成に関する便利な構文が多数用意されており、非常に簡潔にクラスを扱うことができます。この章では、まずクラスの基本的な利用方法について説明した後、それらの簡潔な構文の使い方について説明をします。
ここでは、まずF#における3つの実行環境(インタプリタ、コンパイル、スクリプト)を説明します。さらに、それらを編成する方法として名前空間、モジュール、シグネチャファイルなどについての説明をします。
関数型言語には、関数型言語の特徴を生かしたリスト、配列、木などのデータ処理技法が多く存在します。この技法は不変性、高階関数、パターンマッチング、型推論などの関数型言語がもつ特徴をふんだんに利用することで、非常に強力な表現力を持つようになります。ここでは、そのうちよく使われるリスト処理の技法について説明します。
Microsoftの提供しているF#のポータルサイトです。Microsoftの内外を問わず、さまざまなF#関係のサイトへのリンクが張られおり、たいていの情報はここから辿ることができます。
Visual Studio 2010 beta 1のMSDNライブラリ内にある、F#のドラフト仕様です。本サイトは、ここの情報を一次情報源として利用しています。
Microsoft Researchが提供している、F#の公式サイトです。F#の言語仕様や処理系はここでダウンロードできます。上のMicrosoft F# Developer Centerがオープンする以前は、ここが一番オフィシャルなサイトでした。
deko_ponさんによるF#の入門サイトです。私の知る限り、日本で初めてF#に関する詳細を網羅したサイトです。すばらしい充実度で、本サイトを執筆する際に何度も参考にさせていただきました。
Don Syme's WebLog on the F# Language and Related Topics
F#を開発しているチームの中心人物であり、書籍Expert F#の著者でもあるDon Syme氏のBlogです。F#に関する重要な最新情報はよくここで発表されます。
Robert Pickering's Strange Blog
F#のエヴァンジェリストであり、書籍Foundations of F#の著者でもあるRobert Pickering氏のBlogです。今度Foundations of F#の第2版として、Beggning F#を出版するそうです。
国内ではF#に関して一番ホットなBlogです。いつもF#の実用的で深い情報を提供してくれます。当然、本サイトを作る際には大変参考にさせてもらっています。
Windowsプログラミングに関する最新情報を扱うBlogです。ネイティブからマネージドまで幅広い内容を扱っており、F#に関する記事などがあります。
プログラミングに関する理論的なテーマをよく扱うBlogです。計算理論・圏論・プログラミング言語論など、毎回高度なテーマを扱っています。
Revision History | ||
---|---|---|
2009/01/27 | ||
仮公開 | ||
2009/03/15 | ||
β版公開 | ||
2009/4/9 | ||
「関数の基本」「高階関数とジェネリック」「参考文献」の細かい修正 | ||
2009/4/14 | ||
全体的な細かい修正、「基本的な構文」に演習問題を追加 | ||
2009/4/15 | ||
「基本的な構文」「関数の基本」に演習問題を追加 | ||
2009/4/17 | ||
スタイルシートを少し修正 | ||
2009/4/18 | ||
「関数の基本」の末尾再帰に関する説明を全体的に修正mさらに演習問題を少し追加 | ||
2009/4/21 | ||
「基本的な型と演算」「基本的な構文」「関数の基本」の説明を修正、「関数の基本」に演習問題を追加 | ||
2009/4/22 | ||
「チュートリアル」におけるキーバインドの間違いを修正、「基本的な型と演算」に評価(evalutaion)に関する説明を追加、「関数の基本」の関数の定義に説明を追加 | ||
2009/4/24 | ||
「関数の基本」の演算子の説明を修正、演習問題を追加 | ||
2009/4/26 | ||
「チュートリアル」の軽量構文に関する説明を図入りにしてわかりやすく修正 | ||
2009/4/28 | ||
「高階関数とジェネリック」の説明を修正&演習問題を追加、「チュートリアル」を修正 | ||
2009/4/30 | ||
「高階関数とジェネリック」のクロージャの説明を見直し中に間違いに気づいたので注意を追加 | ||
2009/5/6 | ||
「関数の基本」に「識別子のスコープ」という小節を追加 | ||
2009/5/11 | ||
| ||
2009/5/12 | ||
| ||
2009/5/13 | ||
| ||
2009/5/18 | ||
| ||
2009/5/20 | ||
| ||
2009/5/21 | ||
| ||
2009/5/22 | ||
| ||
2009/5/23 | ||
| ||
2009/5/24 | ||
| ||
2009/5/25 | ||
| ||
2009/5/26 | ||
| ||
2009/5/27 | ||
| ||
2009/5/29 | ||
| ||
2009/5/30 | ||
| ||
2009/6/2 | ||
| ||
2009/6/4 | ||
| ||
2009/6/5 | ||
| ||
2009/6/7 | ||
| ||
2009/6/8 | ||
| ||
2009/6/9 | ||
| ||
2009/6/10 | ||
| ||
2009/6/11 | ||
| ||
2009/6/12 | ||
| ||
2009/6/14 | ||
| ||
2009/6/15 | ||
| ||
2009/6/16 | ||
| ||
2009/6/17 | ||
| ||
2009/6/18 | ||
| ||
2009/6/19 | ||
| ||
2009/6/22 | ||
| ||
2009/6/23 | ||
| ||
2009/6/24 | ||
| ||
2009/6/30 | ||
| ||
2009/7/1 | ||
| ||
2009/7/2 | ||
| ||
2009/7/3 | ||
| ||
2009/7/6 | ||
| ||
2009/7/7 | ||
| ||
2009/7/8 | ||
| ||
2009/7/10 | ||
| ||
2009/7/13 | ||
| ||
2009/7/22 | ||
| ||
2009/8/4 | ||
| ||
2009/8/6 | ||
| ||
2009/8/20 | ||
| ||
2009/8/25 | ||
| ||
2009/8/26 | ||
| ||
2009/8/27 | ||
| ||
2009/8/28 | ||
| ||
2009/9/2 | ||
| ||
2009/9/9 | ||
| ||
2009/9/30 | ||
| ||
2009/10/8 | ||
| ||
2009/10/22 | ||
|