generated at
Functor則
Functor型クラスのインスタンスはファンクター則を満たしている必要がある

ファンクター則
第一法則
fmap id = id を満たす
idでファンクター値を写した場合、ファンクター値が変化してはいけない
js的に書けば u.map(a ⇒ a) === u
第二法則
fmap (f . g) = fmap f . fmap g を満たす
2つの関数fとgについて、「fとgの合成関数でファンクター値を写したもの」と「まずg、次にfでファンクター値を写したもの」が等しい
js的に書けば、 u.map(x ⇒ f(g(x))) === u.map(g).map(f)


第一法則について
hs
-- List fmap id [1,2,3] == id [1,2,3] -- Maybe fmap id (Just 3) == id (Just 3)


Functor型クラスのインスタンスだが、ファンクター則を満たさないもの
data CMaybe a = Nothing | CJust Int a deriving (Show)
ref すごいH本 p.237

参考
じつは第一法則で十分
恒等関数の保存を満たせば合成の保存も自動的に満たせることが分かっている