ファンクター(Functor)

関数型プログラミングにおける**ファンクター(Functor)は、コンテナのような構造に対して関数を適用するための抽象的な仕組みを提供します。これは型クラス(type class)型コンストラクタ(type constructor)**と関数の組み合わせによって実現されます。


ファンクターの定義(理論的視点)

数学(圏論)におけるファンクターとは、ある圏(category)から別の圏への構造を保った写像のことですが、関数型プログラミングでは以下のように捉えられます:

  • ある型 F<T> に対して、関数 f: A → BF<A> に「持ち上げて」F<B> に変換する操作を提供するもの。

これを抽象的に定義すると、次のような構造を持ちます:

haskell
class Functor f where fmap :: (a -> b) -> f a -> f b

ここで:

  • f は型コンストラクタ(例:List, Option, Maybe など)

  • fmap は、通常の関数 a -> b をコンテナ構造 f a に適用して f b に変換する


ファンクターの法則(Functor Laws)

ファンクターを正しく機能させるためには、次の2つのファンクター法則を満たす必要があります:

  1. 恒等法則(Identity Law)

    haskell
    fmap id == id

    fmap に恒等関数 id を適用すると元と同じになる

  2. 合成法則(Composition Law)

    h
    fmap (g . f) == fmap g . fmap f

    関数の合成に対して fmap はその合成を保つ(構造を壊さない)


例:Haskellにおけるファンクター

リストのファンクター

h
fmap (*2) [1,2,3] -- 結果: [2,4,6]

fmap はリストの各要素に (*2) を適用します。

Maybe型のファンクター

haskell
fmap (+1) (Just 3) -- 結果: Just 4 fmap (+1) Nothing -- 結果: Nothing

MaybeJust の中身にだけ関数を適用し、Nothing はそのまま保持されます。


ファンクターの意義と応用

ファンクターの概念は、以下のような抽象的で汎用的な計算の枠組みを提供します:

  • 関数の適用の一般化:ファンクターを使えば、リスト・ツリー・オプションなど異なる構造に対して共通の方法で関数を適用できる。

  • 副作用の抽象化の前段階:モナドなどの構造(副作用を扱う高レベルの抽象)へのステップとして、ファンクターの理解は不可欠。

  • 型安全なデータ変換:構造を壊さずに安全に値を変換できるため、再利用性や保守性が高まる。


関連する型クラス:Applicative, Monad

ファンクターは、より高機能な抽象である ApplicativeMonad の土台となります。これらはファンクターに追加の機能(例えば、関数自体をコンテナに入れて適用するなど)を加えたものです。


まとめ

特徴 内容
抽象レベル 中級~上級(モナドの前段階)
役割 型構造(コンテナ)上での関数適用
型クラス定義 fmap :: (a -> b) -> f a -> f b
必須条件 恒等法則と合成法則を満たすこと
利用例 List, Option, Maybe, Tree など

ご希望があれば、「Applicative」や「Monad」との関係も含めた詳細比較や実装例もご説明できます。

生成日:2025/06/01