純粋関数型パッケージ管理
パッケージをイミュータブルかつ純粋関数的に扱うパッケージ管理のアプローチ。Nixが体現する設計思想。
核心的な考え方
パッケージを「関数の戻り値」として扱う。
パッケージ = f(ソースコード, 依存関係, ビルドスクリプト, ...)
関数型プログラミングにおける純粋関数と同様に、同じ入力からは必ず同じ出力が得られる。これが再現性の源泉となる。
従来アプローチとの違い
従来のパッケージ管理(apt、Homebrew等)はミュータブルなモデルを採用している。/usr/bin/pythonのような固定パスにインストールし、更新すると上書きされる。
純粋関数型アプローチでは:
- イミュータブルなストレージ - パッケージは追加されるのみで変更されない
- ハッシュベースのアドレッシング - Content-Addressable Storageで入力の内容からパスを決定
- 副作用のない評価 - ビルドは隔離環境で行われ、暗黙の依存関係を持たない
もたらす特性
複数バージョンの共存 - パスが異なるため、異なるバージョンが干渉しない
アトミックなアップグレードとロールバック - 古いバージョンはストアに残り、参照先を切り替えるだけで戻せる
再現性の保証 - 同じロックファイルからは、どのマシンでも同じパッケージが得られる
依存関係地獄の解決 - 複数のパッケージが異なるバージョンのライブラリを要求しても共存できる
関連
- Nix - 純粋関数型パッケージ管理の代表的実装
- Nixを理解する - 思想と有効なユースケースの詳細
- 関数型プログラミング - 設計思想の源泉
- イミュータビリティ - ストレージモデルの基礎
- Content-Addressable Storage - ハッシュベースのアドレッシング
- 再現性 - 純粋関数型アプローチが保証する性質
- 依存関係地獄 - 解決しようとしている問題