188 Views
January 21, 26
スライド概要
関数型言語とかのやつ。一部notebooklmが先走った言葉を使ったりしてる。
geminiとの対話で作られた。 https://gist.github.com/podhmo/0a8a662794e04fa7020444a48b801133
関数型プログラミングの深淵と進化 記述スタイルから、型による計算制御、そして「教養」の終焉まで スタイル (Style) 型と制約 (Types & Constraints) 制御と深淵 (Control & Abyss) 「関数型プログラミング」という言葉の解像 度は、この10年で劇的に変化しました。 かつての「高階関数を使うスタイル」から、 現代の「型システムによる副作用の制御」へ。 本スライドでは、FPの進化を4つの「地層」 として捉え直し、言語実装の深淵とエンジ ニアリング文化の変遷を紐解きます。
定義の再構築:「スタイル」から「制約」へ 昔の合意 (The Old Consensus) 現代の主流 (The Modern Reality) Option[T] Result[T, E] Effect[T] ADT: State A ADT: State B Imposeible State (Blocked) Runtime Error Compile-Time Error ・高階関数の利用 (map, filter) ・イミュータブルな変数 ・手続き型言語への「エッセンス」の導入 (Java/JS等) ・型による関心の分離: 副作用を型システムの中に閉じ込める (Option, Result, Effect) ・代数的データ型 (ADT): 「ありえない状態」を型レベルで表現不 可能にする ・コンパイル時の証明: ランタイムエラーをコンパイルエラーに変 換する技術
計算の地層:進化の4段階 Stage 1: Style (スタイル) Java, JS. High-order functions. Stage 2: Expression/Model (式指向・モデル) Lisp, Scheme. Homoiconicity, Macros. Stage 3: Constraints (制約) Haskell, Rust. ADT, Type Safety. Stage 4: Control/Abyss (制御・深淵) Effects, HKT, Delimited Continuations. Key Insight: 進化は一直線ではありません。Stage 2 (自由) とStage 3 (制約) は異なる山頂を目指しまし た。現代の最先端 (Stage 4) は、これらを統合し「計算の制御」そのものを抽象化しようとしています。
Stage 2:式指向とマクロの自由 徹底した式指向 (Expression-Oriented) ifも begin も全てが値を返す。計算とは「式の 評価」であるという純粋なモデル。 同図像性 (Homoiconicity) コードとデータが同じ構造 (S式) を持つ。 「浅い」のではなく「自由」 パターンマッチングすら言語仕様ではなく、マク ロ (Hygienic Macros) で後付けできる柔軟性。 Lispは「言語を作るための言語」として、抽象化 の自由を極限まで追求しました。
Stage 3:自由から「制約」への転換 なぜ制約が必要なのか ソフトウェアの大規模化に伴い、「何ができ るか」よりも「何をしてはいけないか」が重要 になった。 代数的データ型 (ADT) 直積 (Product) と直和 (Sum) でデータを定 義。パターンマッチングと網羅性チェックによ り、ロジックの漏れをコンパイラが指摘。 "Making illegal states unrepresentable" 正しくない状態をコードとして記述できないように設計する(コンパイルが通れば、それは型レベルで正しい)。
Stage 4:計算制御の抽象化 データから「振る舞い」の型へ ・HKT (高カインド型): List<T> ではなく F<T> 自体を扱う。モナドなどの抽象的な構造を定義するた めに必須。 ・GADT (一般化代数的データ型): 型の中に値の性質 (証拠) を埋め込む。 Algebraic Effects (代数的エフェクト) ・副作用を「宣言 (Effect)」と「実行 (Handler)」に分離。 ・非同期処理、例外、状態管理を統一的に扱う次世代の標準。 ・モナドトランスフォーマー (MTL) の「リフト地獄」分離。 ・モナドトランスフォーマー (MTL) の「リフト地獄」や 複雑性を解消する解として注目。
「Schemeの呪い」と部分継続の復権 進化の袋小路:Full Continuation (call/cc) 現代の解:Delimited Continuation (shift/reset) スタックを丸ごと保存するため、メモリ効率が悪 く、コンパイラ最適化を阻害した。 「何でもできる」が故に、扱いがきわめて困難。 計算の「一部」だけを切り出す。軽量で合成可能。 これがAlgebraic Effectsの実装基盤となり、現代 の型システム裏側で静かに復権している。 Insight: 技術は死なず、形を変えて (型安全なエフェクトとして) 再評価される。
最適化:ゼロコスト抽象化への道 人間にとっての「式」、機械にとっての「最適化」 式指向 (副作用がない) は、コンパイラにとってデータの流 れを追いやすく、最適化しやすい。 Stream Fusion & Inlining map や filterの連鎖は、中間データを生成しない単一の ループへと融合される。JSエンジンのJITやRustのLLVMは、 高階関数のオーバーヘッドを消し去る (インライン化)。 結論:「書きやすさ」と「実行速度」は、コンパイラの進化に よって矛盾しなくなった。
対抗論:なぜOOPは死なないのか Micro vs Macro 局所的なロジック (Micro) はFPが制したが、シ ステム全体 (Macro) やUIの設計はOOP (オブジェク トコンポーネント) が支配している。 認知モデルとツール ・ドット (.) の発見可能性: IDEで object. と打てば 機能が出る体験は、FPの「型を探す」体験より認 知負荷が低い。 ・カプセル化: ドメイン駆動設計 (DDD) における 「データと振る舞いの凝集」はOOPの方が自然。 収束 現代の言語 (Rust/TS/Scala) は、FPでロジックを書 き、OOPでモジュールを組むハイブリッドへ。
文化変遷:「教養」から「専門技術」へ リソースの有限性 (Finite Resources) エンジニアの知的好奇心は、今や 「構造の美しさ (FP)」より 「データによる推論 (ML)」や 「アルゴリズムの極限 (競プ ロ)」に向いている。 教養の終焉 かつてFPは「頭を良くするための 教養」だった。現在は「超大規模 システムやコンパイラを作るため の、高度に純化された専門技術 (重火器)」となった。 Insight: 一般化 (コモディティ化) したFPのエッセンスは既存言語に溶け込み、最先端はより深く、狭い領域へ。
結論:総合格闘技としての現代FP State of the Art: 現在の関数型プログラミングは、単なるコ ーディングスタイルではありません。 ・「型による証明 (Structure)」 ・「エフェクトによる制御 (Control)」 ・「コンパイラによる最適化 (Speed)」 これらが融合した、エンジニアリングの総 合格闘技です。 Takeaway: FPを学ぶことは、もはや「書き方」を学ぶことではなく、計算機のリソースと複雑 性を支配するための「設計論」を学ぶことを意味します。
Appendix: Terminology ADT (Algebraic Data Types): 代数的データ型。直積と直和でデータを定 義する手法。 HKT (Higher-Kinded Types): 高カインド型。型を受け取る型を抽象化する 機能。 Algebraic Effects: 副作用の宣言と実行を分離する手法。 Delimited Continuation: 部分継続。計算の一部を切り出して操作する 機能。 Homoiconicity: 同図像性。プログラムとデータが同じ構造 を持つ性質 (Lisp等)。 Stream Fusion: 中間データを削除し、ループを統合する最適 化技術。