Pyon's Diary


舊 令和貳年庚子睦月拾玖日 (水・晴)

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

を共に滿たす.

晩御飯

  • 海鮮ピラフ (自家製ベーコン入り)
  • ベーコン白菜スープ
comments powered by Disqus