LYH 7.10 Functor 型クラス

7.10 Functor 型クラス

1.序文

  1. Functorはどのような型クラスか。
  2. Functor型クラスに属している型の例を1つあげよ。
  3. Functor型クラスの実装を示せ。
  4. 3.中のfmapを読み、どのような関数か説明せよ。
  5. リストに対するFunctorインスタンス宣言を示せ。

2.MaybeはFunctorだよ、たぶん

  1. MaybeをFunctorのインスタンスとして宣言するコードを書け。

3. TreeもFunctorの森に

  1. fmapをTree a型専用の関数と思って型シグネチャを書け。
  2. TreeをFunctorのインスタンスとして宣言するコードを書け。

4. EitherはFunctorであるか否か

  1. Functor型クラスは型引数をいくつ要求するか。
  2. Either a bは型引数を2つ要求する。これはファンクターに出来るだろうか。どのようにすればよいか。
  3. 標準ライブラリのControl.Monad.Instances内で、Either aはどのように定義されているか。
  4. fmapがEither aに特化していたとして、型シグネチャを書け。
  5. fmapがRightを優先する(?)ことをなんというか。

解答

1.

  1. 全体を移せる、写像、map over
  2. リスト
class Functor f where
    fmap :: (a -> b) -> f a -> f b
  1. 「ある型aから別の型bへの関数」と、「ある型aに適用されたファンクター値」を取り、「別の型bのほうに適用されたファンクター値」を返す関数。
instance Functor [] where -- []はリスト型の型コンストラクタ
    fmap = map

2.

instance Functor Maybe where
    fmap f (Just x) = Just (f x)
    fmap f Nothing = Nothing

3.

  1. (a -> b) -> Tree a -> Tree b
instance Functor Tree where
    fmap f EmptyTree = EmptyTree
    fmap f (Node x left right)
        = Node (f x) (fmap f left) (fmap f right)

4.

  1. 1つだけ要求する
  2. Eitherに引数を1つだけ部分適用して、自由引数を1つ残した状態にする
instance Functor (Either a) where
    fmap f (Right x) = Right (f x)
    fmap f (Left x) = Left x
  1. (b -> c) -> Either a b -> Either a c (b -> c) -> (Either a) b -> (Either a) c と等価
  2. right-biased