1. FPの基本概念と歴史 MOC
- FPの定義と目的
- FPの歴史的背景
- ラムダ計算 (Lambda Calculus) - アロンゾ・チャーチ (FPの理論的基礎)
- LISP言語とその影響 (初期の関数型言語、マクロ、S式)
- [[ML言語ファミリー (Standard ML, OCaml, F#|)]] (静的型付け、型推論、パターンマッチ)
- Haskell言語と純粋関数型プログラミング (遅延評価、モナド、型クラス)
- Erlangとアクターモデル、並行処理
- Scheme, Clojure, Scalaなどの進化と特徴
- 他のプログラミングパラダイムとの比較
- 式 (Expression) と文 (Statement)
2. FPのコア原則 MOC
- 純粋関数 (Pure Functions) MOC
- 副作用 (Side Effects) の管理 MOC
- 不変性 (Immutability) MOC
- 参照透過性 (Referential Transparency) MOC
- 関数は第一級オブジェクト (First-Class Functions) MOC
- 高階関数 (Higher-Order Functions - HOFs) MOC
3. 主要な関数型テクニックと概念 MOC
- 再帰 (Recursion)
- 高階関数の具体的な活用 (HOFs in Practice)
- map関数 (または fmap) (コレクションの各要素に関数を適用)
- filter関数 (コレクションから条件を満たす要素を抽出)
- fold関数 (foldl, foldr) (コレクションを単一の値に畳み込む)
- zip関数とunzip関数
- (オプション) scan関数
- カリー化 (Currying)
- 部分適用 (Partial Application)
- 関数合成 (Function Composition)
- 遅延評価 (Lazy Evaluation / Non-strict Evaluation)
- クロージャ (Closure)
4. 型システムと関数型プログラミング MOC
- 静的型付けと動的型付け
- 型推論 (Type Inference)
- 代数的データ型 (ADT - Algebraic Data Types)
- 直積型 (Product Types) (タプル、レコード、構造体など)
- Variants) (複数の可能性のうちの一つを表す型)
- 代数的データ型とパターンマッチの組み合わせ
- パターンマッチ (Pattern Matching)
- パラメータ多相 (Parametric Polymorphism) / ジェネリクス (Generics)
- アドホック多相 (Ad-hoc Polymorphism) / オーバーロード (Overloading)
- 高カインド型 (Higher-Kinded Types - HKT) (高度なトピック)
- (オプション) 依存型 (Dependent Types) (値に依存する型 - より強力な静的検証)
- (オプション) 線形型 (Linear Types) (リソースを一度だけ使用することを保証する型)
5. 関数型プログラミングにおけるデータ構造 MOC
- 不変データ構造の重要性 (再掲)
- 基本的な不変データ構造
- 永続データ構造 (Persistent Data Structures)
- 遅延リスト (Lazy Lists) (無限データ構造の表現)
6. モナドと関数型エラー処理・副作用管理 MOC (導入~中級)
- モナドの導入
- 具体的なモナドの例
- Optionモナド
- Resultモナド
- IOモナド
- (オプション) Listモナド (非決定性計算)
- (オプション) Stateモナド (状態変化の管理)
- (オプション) Readerモナド (環境依存計算)
- (オプション) Writerモナド (ログ出力などの追加情報)
- ファンクタ (Functor) とアプリカティブファンクタ (Applicative Functor)
- fmap操作をサポートする型コンストラクタ)
- アプリカティブファンクタとは (関数をコンテキストに適用する)
- [[
pure/returnと<*>/ap操作]] - アプリカティブ則
- ファンクタとアプリカティブファンクタ、モナドの関係
- [[
- (オプション) モナドトランスフォーマー (Monad Transformers) (モナドの組み合わせ)
7. 関数型プログラミングのパターンとイディオム MOC
- 関数合成 (Function Composition) のパターン (再掲、より実践的に)
- ポイントフリースタイル (Point-Free Style) の活用例 (再掲)
- Threading Macro) (例:
|>in F#,->in Clojure) - メモ化 (Memoization) (純粋関数の結果をキャッシュして高速化)
- 継続 (Continuation) と継続渡しスタイル (CPS - Continuation-Passing Style) (高度な制御フロー)
- 代数的データ型とパターンマッチを活用した設計パターン
- MonoidとSemigroup (結合可能なデータ構造と操作)
- (オプション) レンズ (Lenses) (不変データ構造の特定部分へのアクセスと更新を関数的に行う)
8. 並行処理・並列処理と関数型プログラミング MOC
- なぜFPは並行処理に適しているのか (不変性、副作用の排除)
- データ並列性 (Data Parallelism) とタスク並列性 (Task Parallelism)
- FPにおける並行処理のモデル
- アクターモデル (Actor Model) (Erlang/OTP, Akka)
- ソフトウェアトランザクションメモリ (STM - Software Transactional Memory) (Clojure, Haskell)
- Promises (非同期処理の結果の表現)
- 並列コレクション操作 (Parallel Collections) (例: Java Streams APIの並列ストリーム, Scalaの並列コレクション)
- イミュータブルデータ構造とロックフリープログラミング
9. 関数型プログラミングの利点と欠点 (再評価) MOC
- 利点 (まとめ)
- 欠点と課題
10. 主要プログラミング言語における関数型プログラミング MOC
- 純粋関数型言語
- HaskellにおけるFP (遅延評価、型クラス、モナド、純粋性)
- 関数型が強いマルチパラダイム言語
- LISPファミリー (Scheme, Common LISP, Clojure) におけるFP (S式、マクロ、REPL、Clojureの不変性とSTM)
- ) におけるFP (強力な型システム、型推論、パターンマッチ、命令型機能とのバランス)
- ScalaにおけるFP (オブジェクト指向との融合、不変コレクション、ケースクラス、Akka)
- ElixirにおけるFP (アクターモデル、OTP、耐障害性)
- 命令型言語における関数型機能の取り込み
- JavaScriptにおけるFP (第一級関数、クロージャ、アロー関数、map/filter/reduce、ライブラリ(Lodash, Ramda))
- PythonにおけるFP (ラムダ式、リスト内包表記、ジェネレータ、itertools, functoolsモジュール)
- JavaにおけるFP (Java 8以降) (ラムダ式、Stream API、Optionalクラス、関数型インターフェース)
- におけるFP (LINQ、ラムダ式、拡張メソッド、タプル、パターンマッチ)
- C++におけるFP (C++11以降) (ラムダ式、
<functional>ヘッダ、<algorithm>ヘッダ)
11. 関数型プログラミングの数学的基礎 MOC (概要)
- ラムダ計算 (Lambda Calculus) の概要
- 圏論 (Category Theory) とFPの関係 (概要)
- 型理論 (Type Theory) (概要)
- カリー=ハワード同型対応 (Curry-Howard Correspondence) (型と論理命題、プログラムと証明の対応)