open netshop

F#による関数型プログラミング入門

written by lowlander

Last update 2009/10/22


Table of Contents

1. はじめに
2. 記法
3. 練習問題
4. 目次
4.1. 第1部 基礎編
4.2. 第2部 応用編
5. 参考文献
5.1. Webサイト
5.2. Blog
5.3. 書籍
6. 更新履歴
7. このページについて

2009/10/22 Visual Studio 2010 beta2がリリースされました!F#の言語仕様もバージョンアップしているため、それを踏まえてこれからページ全体を見直し中です。そのため、説明が古かったりうまくコンパイルできない箇所があるので注意してください。

1. はじめに

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部の執筆がなかなか進まなくてもご容赦ください。

また、このサイトに関するご意見も募集中です。ここの解説をもっと丁寧にしてほしいといった意見や、逆にここの解説方法がわかりやすかったといった意見をいただければ、今後のサイト作りの参考にしたいと思いますので、気軽にメールをください。可能な限りお答えしたいと思います。

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]

3. 練習問題

プログラミング言語を確実に習得するには、概念を学んだあとに実際にコードを書いてみることが重要です。このサイトでは、解説のあとに簡単な練習問題を織り込むことで理解を補おうと考えています。ただしまだ全体が書きかけなこともあって、問題が用意できていない部分が多々あると思いますが、なるべく充実させたいと思います。

4. 目次

4.1. 第1部 基礎編

  1. チュートリアル

    まずはF#の開発環境の導入方法と、本文中のサンプルを実行する方法を説明します。そして、F#の雰囲気をつかむのと同時に開発環境になじんでもらうために、チュートリアル形式でF#に簡単に触れます。

  2. 基本的な型と演算

    F#の基本的な型と、それらに対して定義されている演算を一通り紹介します。章の最後では、識別子について説明します。

  3. 基本的な構文

    もっとも基本的な構文である逐次実行文と条件文の説明したあとに、関数型言語の特徴であるmatch式とパターンマッチについて説明します。

  4. 関数の基本

    関数型言語の中核をなす関数の扱いについて説明します。ここでは「部分適用」「カリー化」といった重要な概念について説明します。後半では関数型言語は、ループの表現にforループではなく再帰呼び出しを使うことを説明します。そして最後に、無名関数であるラムダ式について説明をします。

  5. 高階関数とジェネリック

    関数型言語では、関数自体を「関数値」というひとつの値として扱うことができ、通常の値と同じように関数の引数として受け取ったり戻り値として返したりすることができます。このように関数値をやりとりする関数は「高階関数」と呼ばれ、関数型プログラミングでは非常によく利用されます。

    またこの章の中盤では、関数値のひとつである「クロージャ」の説明をします。クロージャは、高階関数との組み合わせにより驚異的な表現力を持つようになります。

    後半では型推論という概念を説明します。型推論は、変数の型名を記述しなくてもまわりの状況から型を自動的に推論してくれる機能です。F#では型推論を積極的に利用し、基本的に型名の記述は省略します。また、これは.NET Frameworkにおけるジェネリックとも密接に関係しています。ここではそれらの関係について説明します。

  6. 命令型プログラミング

    F#は関数型プログラミング言語ですが、その一方で命令型プログラミングもサポートしています。記述するプログラムによっては、関数型よりも命令型によるプログラミングのほうが適している場合があり、F#では場合によってそれらを使い分けることができます。ここでは、それらの命令型プログラミングの手法について説明します。

  7. オブジェクト指向プログラミング

    オブジェクト指向プログラミングは関数型プログラミングとは相反するパラダイムではなく、これらはうまく組み合わせることができます。また、F#から.NET Frameworkのライブラリを利用するときにも、F#におけるオブジェクト指向プログラミングの方法を知っている必要があります。

    F#には、クラス定義やインスタンスの生成に関する便利な構文が多数用意されており、非常に簡潔にクラスを扱うことができます。この章では、まずクラスの基本的な利用方法について説明した後、それらの簡潔な構文の使い方について説明をします。

  8. プログラムの編成

    ここでは、まずF#における3つの実行環境(インタプリタ、コンパイル、スクリプト)を説明します。さらに、それらを編成する方法として名前空間、モジュール、シグネチャファイルなどについての説明をします。

  9. データ処理

    関数型言語には、関数型言語の特徴を生かしたリスト、配列、木などのデータ処理技法が多く存在します。この技法は不変性、高階関数、パターンマッチング、型推論などの関数型言語がもつ特徴をふんだんに利用することで、非常に強力な表現力を持つようになります。ここでは、そのうちよく使われるリスト処理の技法について説明します。

4.2. 第2部 応用編

  1. 計量単位(units of measure)

  2. アクティブパターン

  3. 遅延評価

  4. イベント

  5. .NETクラスライブラリの利用

  6. 言語指向プログラミング(language oriented programming)

  7. 非同期ワークフロー

  8. ワークフロー

5. 参考文献

5.1. Webサイト

  • Microsoft F# Developer Center

    Microsoftの提供しているF#のポータルサイトです。Microsoftの内外を問わず、さまざまなF#関係のサイトへのリンクが張られおり、たいていの情報はここから辿ることができます。

  • Visual F#

    Visual Studio 2010 beta 1のMSDNライブラリ内にある、F#のドラフト仕様です。本サイトは、ここの情報を一次情報源として利用しています。

  • F# - Microsoft Research

    Microsoft Researchが提供している、F#の公式サイトです。F#の言語仕様や処理系はここでダウンロードできます。上のMicrosoft F# Developer Centerがオープンする以前は、ここが一番オフィシャルなサイトでした。

  • F#入門

    deko_ponさんによるF#の入門サイトです。私の知る限り、日本で初めてF#に関する詳細を網羅したサイトです。すばらしい充実度で、本サイトを執筆する際に何度も参考にさせていただきました。

5.2. Blog

  • 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#の実用的で深い情報を提供してくれます。当然、本サイトを作る際には大変参考にさせてもらっています。

  • NyaRuRuの日記

    Windowsプログラミングに関する最新情報を扱うBlogです。ネイティブからマネージドまで幅広い内容を扱っており、F#に関する記事などがあります。

  • 檜山正幸のキマイラ飼育記

    プログラミングに関する理論的なテーマをよく扱うBlogです。計算理論・圏論・プログラミング言語論など、毎回高度なテーマを扱っています。

5.3. 書籍

  • Expert F#

  • Foundations of F#

  • F# for Scientists

6. 更新履歴

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 
  • 関数の基本

    • 関数の定義の説明に適用に関するnoteを追加

    • カリー化の説明を応用編に移動して説明をかなり詳細化

    • 部分適用の説明のところで定義した関数値という言葉の定義が間違っていたため、それに伴う修正を章全体に加えた

  • 高階関数とジェネリック

    • クロージャの説明を全体的に修正

2009/5/12 
  • トップページを更新

    • いげ太さんのブログへのリンクが間違っていたのを修正(大変失礼しました)

    • 表現のわかりにくい箇所を修正

2009/5/13 
  • 関数の基本

    • 部分適用の説明の細かい間違いを修正

  • 高階関数とジェネリック

    • 高階関数の説明にパイプライン演算子の説明を追加

    • クロージャの説明の細かい間違いを修正

    • クロージャの練習問題を追加

    • ジェネリックの説明の細かい表現を修正

    • ジェネリックの練習問題を追加

2009/5/18 
  • 命令型プログラミング

    • 全体的に見直して細かい表現を修正

    • 演習問題を追加

2009/5/20 
  • オブジェクト指向プログラミング

    • クラスの説明の細かい表現を修正

    • クラスの練習問題を追加

  • Visual Studio 2010 beta 1への対応

    • computation expressionという用語をワークフローという呼称に変更

2009/5/21 
  • Visual Studio 2010 beta 1への対応

    • 用語の修正

      • アクセシビリティ(accessibility)→アクセスコントロール(access control)

      • 逐次実行式(sequential execution expression)→複合式(compound expression)

    • 文法定義を少し修正

    • 予約語を追加

      • 通常の予約語にnotを追加

      • 将来拡張予定の予約語を追加

    • F#の言語仕様のリンク先をMSDNライブラリ内のものに変更

    • インストール方法の説明をベータ版向けに修正

2009/5/22 
  • Visual Studio 2010 beta 1への対応

    • チュートリアル、基本的なデータ型の内容をVisual Studio 2010 beta 1へ対応

    • チュートリアル、基本的なデータ型の表現を修正

    • 5/21の修正が正しくWeb上にアップロードされていなかったので再アップロード

    • 用語の修正

      • F# Interactive→F#インタプリタ

2009/5/23 
  • Visual Studio 2010 beta 1への対応

    • 多倍長数型の仕様変更への対応

    • 用語の修正

      • コピー&アップデート構文 → コピー&更新レコード式

  • チュートリアル

    • 表現のわかりにくい箇所を修正

2009/5/24 
  • Visual Studio 2010 beta 1への対応

    • オブジェクト指向プログラミングにおいて、いくつかの仕様が明確に定義されて説明に齟齬が発生したので調査を開始

      オブジェクト指向プログラミングの説明に注意書きを追加

2009/5/25 
  • Visual Studio 2010 beta 1への対応

    • 用語の修正

      • 自己参照(self-reference)→自己識別子(self-identifier)

    • オブジェクト指向プログラミングの説明を修正

2009/5/26 
  • Visual Studio 2010 beta 1への対応

    • オブジェクト指向プログラミングの説明を再チェック中

      細かい表現の違いを修正

    • 用語の修正

      • インデクサプロパティ(indexer property)→インデックス付きプロパティ(indexed property)

      • 暗黙的フィールド(implicit field)という用語を追加

2009/5/27 
  • Visual Studio 2010 beta 1への対応

    • オブジェクト指向プログラミング

      暗黙的/明示的コンストラクタに関する説明を見直し中

  • 高階関数とジェネリック

    • 数値演算を受け取る高階関数でのプログラムの実行結果の間違いを修正

2009/5/29 
  • Visual Studio 2010 beta 1への対応

    • オブジェクト指向プログラミングの説明の修正をとりあえず完了

      暗黙的/明示的コンストラクタという用語ではなく、暗黙的/明示的クラス定義という用語を導入して、それらの違いをより詳しく説明

  • 文法の表現を試験的に見直し

2009/5/30 
  • Visual Studio 2010 beta 1への対応

    • 基本的なデータ型

      bignum型を使用する際の注意を更新

2009/6/2 
  • オブジェクト指向プログラミング

    • インターフェイスの練習問題を追加

    • オブジェクト式の説明を修正

2009/6/4 
  • オブジェクト指向プログラミング

    • 構造体、列挙型の練習問題を追加

2009/6/5 
  • Visual Studio 2010 beta 1への対応

    • オブジェクト指向プログラミング

      「F#特有の型とクラスの関係」において自動実装されるインターフェイスの変更

2009/6/7 
  • オブジェクト指向プログラミング

    • 「F#特有の型とクラスの関係」「クラス・インターフェイス・構造体の糖衣構文」に練習問題を追加

  • 基本的な型と演算

    • (いげ太さんのご指摘により)decimalを固定小数点数と誤って表記していたのを、10進浮動小数点数という表現に修正

2009/6/8 
  • オブジェクト指向プログラミング

    • 「クラス・インターフェイス・構造体の糖衣構文」に練習問題を追加

    • 文法定義の表記方法を修正

    • クラスの暗黙的定義において、プライマリコンストラクタの引数が、そのままクラス内で有効なフィールドとして利用可能となることを追記

2009/6/9 
  • オブジェクト指向プログラミング

    • 用語の変更

      アクセスコントロール→アクセス制御

  • 新章「プログラムの編成」の執筆開始

    タイトルを「モジュール」から「プログラムの編成」に変更

  • 入門編の目次の説明文を修正

2009/6/10 
  • プログラムの編成

    • ページのベースを作成

    • F#インタプリタの説明を作成

2009/6/11 
  • 基本的な型と演算

    • F# PowerPackのダウンロード先が公開されたので更新

  • プログラムの編成

    • F#インタプリタのディレクティブの説明を追加

2009/6/12 
  • プログラムの編成

    • F#インタプリタのインスタンスfsiの説明を追加

2009/6/14 
  • プログラムの編成

    • F#コンパイラ、モジュールの説明を作成

2009/6/15 
  • プログラムの編成

    • F#スクリプト、名前空間の説明を作成

    • F#コンパイラの説明を追加

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 
  • データ処理

    • シーケンスの説明にyield!を追加

    • シーケンスの説明を全体的に見直し

2009/7/7 
  • データ処理

    • シーケンスの説明にfor, while, if, match, let, try-finallyなどを追加

2009/7/8 
  • データ処理

    • それぞれのシーケンス式の説明を追加

2009/7/10 
  • データ処理

    • Seqモジュールの説明を追加

2009/7/13 
  • データ処理

    • 配列、リストにおけるシーケンス式の説明を追加

2009/7/22 
  • データ処理

    • リスト処理の説明を追加

  • データ型

    • リストの説明をすこし詳しくした

2009/8/4 
  • データ処理

    • リスト処理の説明を修正

2009/8/6 
  • データ処理

    • リストの各要素を処理するパターンの説明を追加

2009/8/20 
  • データ処理

    • map, filterの説明を追加

2009/8/25 
  • データ処理

    • foldの説明を追加

2009/8/26 
  • データ処理

    • foldの説明を追加

    • foldの図が間違っていたので修正

2009/8/27 
  • データ処理

    • foldの説明を追加

    • mapの説明を修正

  • 基本的な構文

    • 複合式の説明にignoreを追加

2009/8/28 
  • データ処理

    • mapの説明を修正

2009/9/2 
  • データ処理

    • foldの説明の間違いを修正

2009/9/9 
  • データ処理

    • 細かい記述の修正

2009/9/30 
  • データ処理

    • リスト処理の応用例1を追加

2009/10/8 
  • データ処理

    • リスト処理の応用例2を追加

2009/10/22 
  • Visual Studio 2010 beta 2の公開

7. このページについて

このページへのリンクはフリーです。

ご意見・ご感想はまでお願いします。

Copyright(C) 2009 lowlander, All rights reserved.

inserted by FC2 system