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)
第一法則について
code: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本.icon p.237
参考
すごいH本 11.2
free theorem
じつは第一法則で十分
恒等関数の保存を満たせば合成の保存も自動的に満たせることが分かっている