2 番目の質問への回答と、ダニエルのコメントへのフォローアップを次に示します。あなたは手で法律を確認します.私はFunctor
法律の例を次のように使用しますMaybe
:
-- First law
fmap id = id
-- Proof
fmap id
= \x -> case x of
Nothing -> Nothing
Just a -> Just (id a)
= \x -> case x of
Nothing -> Nothing
Just a -> Just a
= \x -> case x of
Nothing -> x
Just a -> x
= \x -> case x of
_ -> x
= \x -> x
= id
-- Second law
fmap f . fmap g = fmap (f . g)
-- Proof
fmap f . fmap g
= \x -> fmap f (fmap g x)
= \x -> fmap f (case x of
Nothing -> Nothing
Just a -> Just (f a) )
= \x -> case x of
Nothing -> fmap f Nothing
Just a -> fmap f (Just (g a))
= \x -> case x of
Nothing -> Nothing
Just a -> Just (f (g a))
= \x -> case x of
Nothing -> Nothing
Just a -> Just ((f . g) a)
= \x -> case x of
Nothing -> fmap (f . g) Nothing
Just a -> fmap (f . g) (Just a)
= \x -> fmap (f . g) (case x of
Nothing -> Nothing
Just a -> Just a )
= \x -> fmap (f . g) (case x of
Nothing -> x
Just a -> x )
= \x -> fmap (f . g) (case x of
_ -> x )
= \x -> fmap (f . g) x
= fmap (f . g)
もちろん、これらのステップの多くをスキップすることもできましたが、完全な証明を詳しく説明したかっただけです。これらの種類の法則を証明することは、最初はコツをつかむまで難しいので、ゆっくりとペダンティックに始めることをお勧めします。その後、慣れてきたら、ステップを組み合わせて始め、しばらくして頭の中でいくつかのことを実行して、より単純なものにすることもできます。もの。