TL;DR
中に入っている値に関数を適用する fmap を持ち、構造を保ったまま値を変換できる型。Haskell では型クラス Functor として定義されている。関手とも訳される。
仕組み
Haskell の base のドキュメントによると、Functor は次の 2 つのメソッドを持つ。最小限の定義は fmap だけでよい。
class Functor f where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f afmap は次の 2 つの法則を満たす必要がある。
- 恒等:
fmap id == id - 合成:
fmap (f . g) == fmap f . fmap g
2 つ目の法則は、1 つ目の法則と型から導けるので、実際には 1 つ目だけを確かめればよい。
例
Maybeでは、Justの中の値に関数を適用する。- リストでは、すべての要素に関数を適用する。
Either aでは、fmapで変えられるのは最後の型引数だけなので、Left側の型はそのままになる。
Domain Modeling Made Functional の map は、1 トラックの関数を Result を扱う 2 トラックの関数に変換するもので、Haskell の fmap や <$> にあたる。
注意点
Domain Modeling Made Functional によると、ファンクタをさらに抽象化した概念がアプリカティブであり、アプリカティブをさらに抽象化した概念がモナドである。