Functor
Functorのインスタンスは以下のメソッドを實裝する必要がある.
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
そして以下の法則を滿たす必要がある.
fmap id == id
fmap (f . g) == fmap f . fmap g
リスト, Maybe, IO, Either a, タプル(ペア) 及び函數が Functor則 を滿たしゐるか確認する.
リスト
リストに於けるfmapの實裝は以下の通り.
instance Functor [] where
fmap = map
第一法則,
fmap id xs = map id xs = [id x0, id x1, ...] = id xs
第二法則,
fmap (f . g) xs = map (f . g) xs
= [(f . g) x0, (f . g) x1, ...]
= [f (g x0), f (g x1), ...]
= map f [g x0, g x1, ...]
= map f (map g [x0, x1, ...])
= map f (map g xs)
= (map f . map g) xs
= (fmap f . fmap f) xs
を共に滿たす.
Maybe
Maybeに於けるfmapの實裝は以下の通り.
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
Nothingに着いては自明なので省略する. 第一法則,
fmap id (Just a) = Just (id a) = Just a
第二法則,
fmap (f . g) (Just a) = Just ((f . g) a)
= Just (f (g a))
= fmap f (Just (g a))
= fmap f (fmap g (Just a))
= (fmap f . fmap g) (Just a)
を共に滿たす.
IO
IOに於けるfmapの實裝は以下の通り.
instance Functor IO where
fmap f x = x >>= (pure . f)
>>=
が判らないので後回し.
Either
Eitherに於けるfmapの實裝は以下の通り.
instance Functor (Either a) where
fmap _ (Left x) = Left x
fmap f (Right y) = Right (f y)
Leftについては自明なのでRightのみ確認する. 第一法則,
fmap id (Right y) = Right (id y) = Right y
第二法則,
fmap (f . g) (Right y) = Right ((f . g) y)
= Right (f (g y))
= fmap f (Right (g y))
= fmap f (fmap g (Right y))
= (fmap f . fmap g) (Right y)
を共に滿たす.
タプル (ペア)
ペアに於けるfmapの實裝は以下の通り.
instance Functor ((,) a) where
fmap f (x,y) = (x, f y)
第一法則,
fmap id (x, y) = (x, id y) = (x, y)
第二法則,
fmap (f . g) (x, y) = (x, (f . g) y)
= (x, f (g y))
= fmap f (x, g y)
= fmap f (fmap g (x, y))
= (fmap f . fmap g) (x, y)
を共に滿たす.
函數 ((->) r)
函數((->) r)に於けるfmapの實裝は以下の通り. 只の函數合成になる.
instance Functor ((->) r) where
fmap = (.)
第一法則,
fmap id x = (.) id x = id . x = x
第二法則,
fmap (f . g) x = (.) (f . g) x
= (f . g) . x
= f . g . x
= f . (g . x)
= (.) f (g . x)
= fmap f (g . x)
= fmap f ((.) g x)
= fmap f (fmap g x)
= (fmap f . fmap g) x
を共に滿たす.
晩御飯
- 海鮮ピラフ (自家製ベーコン入り)
- ベーコン白菜スープ