7.10 Functor 型クラス
1.序文
- Functorはどのような型クラスか。
- Functor型クラスに属している型の例を1つあげよ。
- Functor型クラスの実装を示せ。
- 3.中のfmapを読み、どのような関数か説明せよ。
- リストに対するFunctorインスタンス宣言を示せ。
2.MaybeはFunctorだよ、たぶん
- MaybeをFunctorのインスタンスとして宣言するコードを書け。
3. TreeもFunctorの森に
- fmapをTree a型専用の関数と思って型シグネチャを書け。
- TreeをFunctorのインスタンスとして宣言するコードを書け。
4. EitherはFunctorであるか否か
- Functor型クラスは型引数をいくつ要求するか。
- Either a bは型引数を2つ要求する。これはファンクターに出来るだろうか。どのようにすればよいか。
- 標準ライブラリのControl.Monad.Instances内で、Either aはどのように定義されているか。
- fmapがEither aに特化していたとして、型シグネチャを書け。
- fmapがRightを優先する(?)ことをなんというか。
解答
1.
- 全体を移せる、写像、map over
- リスト
class Functor f where
fmap :: (a -> b) -> f a -> f b
- 「ある型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.
(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つだけ要求する
- Eitherに引数を1つだけ部分適用して、自由引数を1つ残した状態にする
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
(b -> c) -> Either a b -> Either a c
(b -> c) -> (Either a) b -> (Either a) c
と等価
- right-biased