Skip to content

はじめに

このページでは、F#というプログラミング言語を紹介する。なぜ紹介するのかというと、書いていて楽しい言語だからである。もっとF#の話者が増えると、少しずつ世界が面白くなっていくだろう。そうしたら少しずつ世界が平和になっていくに違いない。そういう野望によって、このページは作成されている。いまは話者が少なく、それゆえに仕事もない。なんとなく趣味でプログラムを書いたり、仕事用の雑に捨てられるスクリプトをF#で書いたりしている。そのうち話者が増えて仕事も増えたら良いな、と願っている。あと世界の平和も願っている。

F#のどこが楽しいか

ソースコードが綺麗に短く書ける

F#の魅力のひとつは、実現したいことを簡潔かつ明確に表現できることだ。冗長な記述が少なくて済む。結果として、読みやすく理解しやすいコードになる。これによってバグが減り、開発効率は向上する……と良いな、と思っている。

例えば、1から10までの整数のうち、偶数だけを抜き出して、それぞれを2乗し、最後にその合計を求めるプログラムを書いてみよう。なんでそんなプログラムを書くのか、なんてことは考えてはいけない。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
List<int> numbers = new List<int>();
for (int i = 1; i <= 10; i++)
{
numbers.Add(i);
}
int sum = numbers.Where(x => x % 2 == 0).Select(x => x * x).Sum();
Console.WriteLine("合計: " + sum); // 出力: 合計: 220
}
}

3年ぶりくらいにC#を書いたので、少々おかしな記述があったとしても勘弁願いたい。たしか、main関数はもっと省略して書けるようになったはずだし、単なるコンソールアプリなら、そもそもClassを使わなくても良かったはず。ListのLINQを使えば、ほとんどF#と同じように書ける……。まあ、今回はわざと冗長に書いたけれど、大体、C#でプログラムをしていると、こういう感じのclassが大量に生まれてくることだろう。

let sum = [1..10] |> List.filter (fun x -> x % 2 = 0) |> List.map (fun x -> x * x) |> List.sum
printfn "合計: %d" sum // 出力: 合計: 220

F#で書くと上記のようになる。

これは1から10までの整数のリストを作成し、そのリストから偶数だけを抜き出して、それぞれを2乗し、最後にその合計を求めるプログラムだ。大体、自然言語で書いたのと同じ順に処理されていくようになっている。

パイプライン演算子(|>)

パイプライン演算子は、F#のコードを川の流れのように美しく、読みやすくする演算子である。ちょっと褒めすぎたかもしれない。先ほどの例でも使っているが、パイプライン演算子は関数を左から右へと適用させていく。たとえば、ある数字にadd関数とmultiply関数を適用させてみよう。

let add x y = x + y
let multiply x y = x * y
let result = 1 |> add 2 |> multiply 3
printfn "%d" result // 出力: 9

これをTypeScriptで書くと、以下のようになる。

const add = (x: number, y: number) => x + y;
const multiply = (x: number, y: number) => x * y;
const result = multiply(add(1, 2), 3);
console.log(result); // 出力: 9

今回は2つの関数を連鎖させただけだが、これが3つ、4つとなっていくと関数のネストが増えてわけがわからなくなっていく。それを防ぐことができるのがパイプライン演算子である。

あとは、ifが式であるので値を返せるとか、強力なパターンマッチングとか、自動的に関数がカリー化されるとか、そういう嬉しいポイントがたくさんあるのがF#の魅力である。とにかく書いていて楽しい。こんなに素晴らしい言語は他にないだろう。ついでにF#が書けるようになったらOcamlも書けるようになったも同然だ。ノルウェー語が話せたらスウェーデン語も話せるようになった、みたいな感じだ。あと、Rustも結構似ていると思う。とはいえ、Rustを書いていると、カリー化とかパイプライン演算子とか、そういう機能がほしくなってくるけれども……。

とにかくF#は面白い言語なのである。これからF#を学ぼうと思っている人にとって、このページが少しでも役に立てば幸いである。