関数型プログラミングにおける**ファンクター(Functor)は、コンテナのような構造に対して関数を適用するための抽象的な仕組みを提供します。これは型クラス(type class)や型コンストラクタ(type constructor)**と関数の組み合わせによって実現されます。
ファンクターの定義(理論的視点)
数学(圏論)におけるファンクターとは、ある圏(category)から別の圏への構造を保った写像のことですが、関数型プログラミングでは以下のように捉えられます:
-
ある型
F<T>に対して、関数f: A → BをF<A>に「持ち上げて」F<B>に変換する操作を提供するもの。
これを抽象的に定義すると、次のような構造を持ちます:
ここで:
-
fは型コンストラクタ(例:List,Option,Maybeなど) -
fmapは、通常の関数a -> bをコンテナ構造f aに適用してf bに変換する
ファンクターの法則(Functor Laws)
ファンクターを正しく機能させるためには、次の2つのファンクター法則を満たす必要があります:
-
恒等法則(Identity Law)
fmapに恒等関数idを適用すると元と同じになる -
合成法則(Composition Law)
関数の合成に対して
fmapはその合成を保つ(構造を壊さない)
例:Haskellにおけるファンクター
リストのファンクター
fmap はリストの各要素に (*2) を適用します。
Maybe型のファンクター
Maybe は Just の中身にだけ関数を適用し、Nothing はそのまま保持されます。
ファンクターの意義と応用
ファンクターの概念は、以下のような抽象的で汎用的な計算の枠組みを提供します:
-
関数の適用の一般化:ファンクターを使えば、リスト・ツリー・オプションなど異なる構造に対して共通の方法で関数を適用できる。
-
副作用の抽象化の前段階:モナドなどの構造(副作用を扱う高レベルの抽象)へのステップとして、ファンクターの理解は不可欠。
-
型安全なデータ変換:構造を壊さずに安全に値を変換できるため、再利用性や保守性が高まる。
関連する型クラス:Applicative, Monad
ファンクターは、より高機能な抽象である Applicative や Monad の土台となります。これらはファンクターに追加の機能(例えば、関数自体をコンテナに入れて適用するなど)を加えたものです。
まとめ
| 特徴 | 内容 |
|---|---|
| 抽象レベル | 中級~上級(モナドの前段階) |
| 役割 | 型構造(コンテナ)上での関数適用 |
| 型クラス定義 | fmap :: (a -> b) -> f a -> f b |
| 必須条件 | 恒等法則と合成法則を満たすこと |
| 利用例 | List, Option, Maybe, Tree など |
ご希望があれば、「Applicative」や「Monad」との関係も含めた詳細比較や実装例もご説明できます。
生成日:2025/06/01