1. 概要
関数型プログラミング(Functional Programming, FP) は、数学における「関数」の考え方を基盤にしたプログラミングパラダイムです。
- 副作用を避ける(pure functions)
- 状態を持たない(immutability)
- 関数を第一級の値として扱う
という特徴があり、宣言的スタイルで「何をするか」を書くことに重点を置きます。
2. 歴史
- 1950年代:LISP が登場し、関数型言語の原型に
- 1990年代〜2000年代:Haskell や ML 系が研究・学術分野で活用
- 2010年代以降:Scala、Elixir、F# などが商用開発でも普及
- 現在:Kotlin / Java / JavaScript / Swift などモダン言語が OOP + FP ハイブリッド を採用
3. 特徴
-
イミュータブル(不変性)
変数を書き換えず、新しい値を返す -
純粋関数(Pure Function)
入力が同じなら必ず同じ出力を返し、副作用を持たない -
高階関数(Higher-order function)
関数を引数・戻り値として扱える -
関数合成(Composition)
小さな関数を組み合わせて大きな処理を作る -
宣言的スタイル
命令ではなく「変換」を記述する
4. メリット
- テスト容易性:純粋関数は予測可能でユニットテストに強い
- 並列・並行処理に強い:不変性によりスレッドセーフ
- 安全性:副作用が少なくバグを減らす
- 簡潔性:map/filter/reduce で短く書ける
5. Kotlinによる例:FizzBuzz
(1)シンプルな純粋関数
fun fizzBuzz(n: Int): String =
when {
n % 15 == 0 -> "FizzBuzz"
n % 3 == 0 -> "Fizz"
n % 5 == 0 -> "Buzz"
else -> n.toString()
}
fun main() {
(1..20)
.map(::fizzBuzz) // 関数を適用
.forEach(::println)
}
fizzBuzz は「入力 → 出力」のみを持つ純粋関数。
(1..20).map(::fizzBuzz) で 「データをどう変換するか」 を宣言的に表現。
6. 代表的な言語
Lisp(1958)
- 最初の関数型言語。AI研究に広く利用された
Haskell(1990)
- 純粋関数型言語。学術界から商用利用へ広がった
ML / OCaml / F#
- 静的型付きFP言語。金融システムや数理分野で利用
Erlang / Elixir
- 並行処理に強いFP言語。WhatsAppや電気通信システムで利用
Scala
- JVM上でOOP + FPを統合。大規模分散システムに強い
JavaScript / TypeScript / Kotlin / Swift
- 近年はモダン言語がFP的要素(map/filter/reduce, ラムダ式)を取り込んでいる
7. OOP との比較
| 観点 | OOP | FP |
|---|---|---|
| 中心概念 | オブジェクト | 関数 |
| データ | 状態を持ちうる | 基本的に不変 |
| 拡張性 | 継承・ポリモーフィズム | 関数合成・高階関数 |
| 強み | 大規模開発、現実世界のモデリング | 並列処理、データ変換、安全性 |
まとめ
- FPは 「関数を第一級市民」とするパラダイム
- 副作用を避け、イミュータブルな世界で安全に計算する
- KotlinはOOP言語でありながら、FP的スタイルを自然に取り込める
- 現代の開発では OOP + FP のハイブリッドが主流