F#はマイクロソフトリサーチによって開発されたプログラミング言語です。関数型言語のOCamlをベースに開発されています。C#やVisual Basicと同じように、.NET Framework上で動作するのが特徴で、.NET由来の豊富なライブラリが利用できます。そのため、型推論やパターンマッチ、遅延評価など関数型言語由来の先進的な機能を持ちながら、.NETの実用的なライブラリを利用できるのが特徴です。
F#について
F#は2002年にマイクロソフトリサーチのドン・サイムらによって開発が始められ、Visual Studio 2010のリリースと共に公開されました。もともと、実用性が高く人気の関数型言語のOCamlをベースにして開発されました。そのため、OCamlの影響を強く受けています。F#のFはFunctional(関数型)を意味しています。
また、.NET上で動作するのが特徴で、C#やVisual Basicなどの.NET Framework言語と相互運用性があります。C#で作ったライブラリを呼び出すこともできますし、逆にF#で作ったライブラリを、C#から使うこともできます。そして、現在、.NET Frameworkは、macOSやLinuxでも動くため、幅広い環境でF#で作ったプログラムを動かすことができます。
簡潔にプログラムを書けることや、バグの少ないプログラムを書くための機能が充実していること、コンパイル言語であり実行速度が速いことが特徴です。
F#の開発環境を整える
最初にF#の開発環境を整えましょう。Windowsでは、Visual Studio 2019をインストールします。Visual Studio 2019には、用途に合わせていろいろなエディションが用意されています。個人開発者、あるいは、学習目的であれば無料で利用できる、Communityエディションが便利です。こちらよりインストーラーをダウンロードして、インストールしましょう。
インストーラーを実行すると、以下のような画面が表示されます。そこで、今回は「.NETデスクトップ環境」を選んでインストールしてみましょう。F#をはじめ、C#やVisual Basic、開発ツールの一式必要なツールがインストールされます。
macOSやLinuxでもMonoをインストールすることで使えるようになります。詳しくは、こちらのmacOSとLinuxのページが参考になります。
簡単なプログラムを実行するまでの手順
ここでは、WindowsにVisual Studio 2019 Communityエディションをインストールしたものとして話を進めます。
まず、Visual Studio 2019を起動します。そして、「新しいプロジェクト」を選択します。そして、「(F#)コンソールアプリケーション」を選んで[次へ]ボタンをクリックします。そして、適当な名前をつけて[作成]ボタンをクリックします。すると、F#の開発画面が表示されます。
そこで、Hello, World!と表示するだけのプログラムを書いてみましょう。printfnと書くと文字列と改行を出力します。以下のプログラムを記述した上で[F5]キーを実行してみましょう。
printfn "Hello, World!"
すると、一瞬"Hello, World!"の文字が表示されたコンソール画面が表示されますが、すぐに終了してしまいます。これでは、しっかり文字が表示されているか確認できません。キーを入力するまで終了を待機するようにしてみましょう。
open System
printfn "Hello, World!"
Console.ReadKey() |> ignore
上記のプログラムを[F5]キーで実行すると、コンソール画面に"Hello, World!"と表示されているのが確認できます。以下のように表示されます。
プログラムの一行目で『open (ライブラリ名)』のように書くことでライブラリが利用できるようになります。三行目にある『Console.ReadKey()』の部分は、文字が入力されるまで待機するメソッドです。これは、C#でも使えるもので、.NETのライブラリが使えることが分かるでしょう。
簡単な計算をしてみよう
次に簡単な計算をコンソール画面に出力するプログラムを作ってみましょう。F#は静的型付けの言語なので、本来、変数などを使う際には、整数(int)型や実数(float)型の指定を記述する必要があります。しかし、自動的に型を判定する『型推論』の機能を持っています。
以下のプログラムは簡単な計算を行うものですが、型推論の機能を利用して、型の指定を省略しています。他の動的型を持つ、スクリプト言語のようにも見えるでしょう。これがF#の魅力の一つです。
open System
// 簡単な計算
let a = 1 + 2 * 3
Console.WriteLine a // 結果→ 7
let b = (1 + 2) * 3
Console.WriteLine b // 結果→ 9
let c = 10.5 / 2.0
Console.WriteLine c // 結果→ 5.25
Console.ReadKey() |> ignore
これをVisual Studioで実行すると、以下のように表示されます。
FizzBuzz問題を解くプログラム
それでは、本連載恒例のFizzBuzz問題を解くプログラムを紹介します。これは、以下のような問題を解くプログラムです。
1から100までの数字を出力する際に、3の倍数の時「Fizz」、5の倍数の時「Buzz」、3と5の倍数の時「FizzBuzz」と表示するプログラムを作って下さい。
実際のプログラムは、以下の通りです。
open System
// FizzとBuzzの条件を関数定義 --- (*1)
let isFizz n = (n % 3) = 0
let isBuzz n = (n % 5) = 0
// FizzBuzzの値を返す関数を定義 --- (*2)
let fizzbuzz n =
if (isFizz n) && (isBuzz n) then "FizzBuzz"
elif (isFizz n) then "Fizz"
elif (isBuzz n) then "Buzz"
else n.ToString()
// 1から100まで繰り返し実行 --- (*3)
for i in 1..100 do
Console.WriteLine(fizzbuzz i)
// キー入力を待機
Console.ReadKey() |> ignore
プログラムを実行すると、以下のように表示されます。
このプログラムでも、型推論を利用しているので、一カ所も型宣言を記述することなくプログラムを完成させることができました。しかし、Visual Studioは賢いので、マウスカーソルを、関数『isFizz』の上に持って行くなら、ツールチップに『val isFizz : n:int -> bool』と表示され、暗黙的に型宣言がされていることが確認できます。
プログラムの各部分を個別に見ていきましょう。(*1)の部分では、FizzとBuzzの条件を関数として定義します。Fizzは3で割りきれる数、Buzzは5で割り切れる数です。
そして、(*2)の部分では、(*1)で定義したisFizzとisBuzzの関数を利用して、FizzBuzzの値を返す関数を定義します。if ... then ... elif ... else ... の構文を利用して、次々と条件を判定し、FizzBuzzの値を決定します。
最後の(*3)の部分では、for ... in ... doを利用して、100回の繰り返し処理を記述します。F#ではPythonのようにインデントによりブロックを指定できるので、このように、すっきりとしたプログラムを記述できます。
F#のまとめ
以上、今回は、C#やVisual Basicと並ぶ、.NET Frameworkの主要言語の一つ『F#』について紹介しました。ここで紹介した簡単なプログラムを見るだけでも、F#を使うと簡潔でスマートにプログラムを書けることが分かったのではないでしょうか。確かに、関数型言語が持つ難しさもありますが、それをVisual Studioの強力な支援機能、そして、.NETのライブラリが十分に補ってくれます。そのため、これからも、F#は、Web開発やモバイルアプリ開発など、様々な分野で使われていくことでしょう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。