特集:C#開発者のためのF#入門(前編)

F#で初めての関数型プログラミング

bleis-tift
2012/04/12
Page1 Page2 Page3

F#とは

 F#は、マイクロソフト社製のプログラミング言語で、Visual Studio 2010から標準搭載されている。まずは、F#がどのような言語なのかを見てみよう。

マルチパラダイム言語「F#」

 F#は複数のパラダイムをサポートするマルチパラダイム言語だ。F#がサポートするパラダイムには、

  • 手続き型
  • 関数型
  • オブジェクト指向プログラミング

などがある。

 マルチパラダイム言語であるため、C#やVB(Visual Basic)といった従来の.NET言語を置き換える形でF#を使うこともできる。しかし、本記事ではF#のメインとなるパラダイムである「関数型」にフォーカスを当てて紹介していく。

関数型言語「F#」

 F#は、静的型付けの関数型言語である「OCaml」に強い影響を受けている。そのため、F#の主となるパラダイムは関数型プログラミングになる。

 さて、関数型言語とは何だろうか?

 この問いには「これだ」という答えはなく、人によってさまざまな答えが返ってくる。ちょっとキーワードを挙げてみよう。

  • 関数がファースト・クラス(=第一級)
  • ラムダ式(無名関数)
  • クロージャ
  • 型推論
  • パターン・マッチ
  • 参照透明性
  • 遅延評価
  • 末尾最適化

 どれか1つくらい聞いたことがないだろうか?

 この中から数個を選んで「これらの機能を持てば関数型言語だ」とする人もいる。こういう状況なので、あまり真剣に「関数型言語」を説明しても得られるものは少ないだろう(ちなみに筆者は、ラムダ計算に基づく言語であれば「関数型言語」と呼べばいいと思っている……何のこっちゃ)。

 そのため、ここではより得るものが多くなるように、F#が静的型付け関数型言語であるというところから来る利点を軽く説明する。

 まず、F#は型を気軽に定義して使うことができる。例えば、名前と年齢を保持するPerson型が欲しいと思ったとしよう。C#では、例えば次のコードのようになるだろう。

public class Person
{
  public readonly string Name;
  public readonly int Age;
  public Person(string name, int age)
  {
    this.Name = name;
    this.Age = age;
  }
}
名前と年齢を保持するPerson型のコード(C#)

 それに対してF#では、次のように、C#よりもかなり短く型を定義できる。

type Person = {
  Name: string
  Age: int
}
名前と年齢を保持するPerson型のコード(F#)

 それだけではない。C#で、Person型を使って次のようなコードを書いたとする。

var a = new Person("hoge", 24);
var b = new Person("hoge", 24);
if (a == b)
  System.Console.WriteLine("OK!");
else
  System.Console.WriteLine("Oops...");
同じフィールド設定で生成した2つのオブジェクトを比較した結果(C#)

 このプログラムは「Oops...」を表示する。

 それに対して、F#で次のようにすると、「OK!」が表示される。

let a = { Name = "hoge"; Age = 24 }
let b = { Name = "hoge"; Age = 24 }
if a = b then
  System.Console.WriteLine("OK!")
else
  System.Console.WriteLine("Oops...")
同じフィールド設定で生成した2つのオブジェクトを比較した結果(F#)

 このように、F#では型を定義すると、比較演算子なども裏で定義してくれるのである。型の定義が気軽に行え、かつ定義した型の値が便利に使えるという特徴を指して、筆者は「型が軽い」と表現している。

 F#の2つ目の特長として、型推論がある。C#のコードでも「var」を使って型推論機能を使っているが、F#のコードでは「=」の右辺側にすら型名を書いていない。C#やVBでも関数型言語由来の機能を取り入れてはいるが、主とするパラダイムが関数型ではないために、本来受けられる恩恵の一部しか享受できない、ということがある。それに対してF#は主とするパラダイムが関数型であるため、より多くの恩恵を受けられるのである。

 この2つ以外にもいろいろと利点はあるが、ここではこのくらいにしておこう。

準備

 以降ではF#に標準搭載されている対話環境を使う。Visual Studio 2010がインストールされているものとして進める。インストールしていない場合は、「Try F#」を使うのが一番手っ取り早いだろう。

 F#の対話環境を起動するためには、[スタート]メニューの[すべてのプログラム]から、[Microsoft Visual Studio 2010]−[Visual Studio Tools]とたどり、[Visual Studio コマンド プロンプト (2010)]を実行して、「fsi」コマンドを実行する。

 入力待ちになるので、そこにF#コードを入力して実行していくわけだが、今まで入力した部分までを実行するためにはセミコロン(;)を2つ入力し、[Enter]キーを押せばいい。

 試しに「10 + 20;;」と入力し、[Enter]キーを押してみよう。「val it : int = 30」と、「10+20」が計算された値が表示されたはずである。これは、「itという変数の型はintで、値は30」を意味している。

 このように、F#の対話環境では最後に実行した結果を「it」という変数で参照できるようになっている。

 対話環境を終了するためには、「#q;;」と入力すればいい。


 INDEX
  特集:C#開発者のためのF#入門(前編)
  F#で初めての関数型プログラミング
  1.F#とは
    2.関数型プログラミングの基礎
    3.リストとタプル
 
  特集:C#開発者のためのF#入門(後編)
  F#言語の基礎文法
    1.主要な文法: if式/letキーワード/レコード
    2.主要な文法: 判別共用体/パターン・マッチ


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間