« Haskell Functor type class | トップページ | Haskell Applicative Monoid »

2011年4月17日 (日)

Haskell Functor type class 2

Functor のリベンジ

Functor type classの定義

class Functor f where fmap :: (a -> b) -> f a -> f b

fは、type constructorであり、具体的な型 a,bを受け取って、具体的な型になる。

(Maybeは具体的な型ではないが、Maybe Int は、具体的な型、ということです。)

f a の部分について、以下のようなパターンが想定できる。
・Maybe Int
・[Char]
・IO String
など

これは、なんらかの値をある文脈においた物、と理解できる。

たとえば、
Maybe Intの場合、Intの値をMaybeという文脈で理解する、ということ。

言い換えれば、数値が入っているか、何も無いか。

fmapは、このような文脈から、値を抜き出して(f a のaを取り出し)、演算し(a -> b)、文脈に戻す(f b)。

f aが、f bになるだけなので、文脈は変化しない。(Maybe Int -> [Char]にはならない)

Applicativeについて

Applicative type classの定義

class (Functor f) => Applicative f where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b

<*>は、fmapに似ている。

fmapは、関数とFunctor値を引数にとって、Functor値を返す。
<*>は、Functor値(中身は関数)とFunctor値(中身は値)をとって、Functor値(中身は値)を返す。

Functor値とは、f(a->b)や、f aや、f bのことで、ある文脈に置かれた値(関数含む)のこと。

Functor値(中身は関数)というのは、例えば、Just(3+)のことで、これは、(3+)という関数をJustで包んでいることによって、
Maybe(a -> b)型の値になっている。

だからなんなのか。

Maybeに関して考えるなら、Maybe (a -> b)は、Nothingに成り得る。
関数をMaybeという文脈で考えるため、「引数をひとつもつ関数であるか、何も無いか」となる。

このため、<*>の左辺値は、Nothingでもよい。(Nothingが来たときの想定を含む実装をする)

これは、通常のFunctorでは表現できない。

>let a = fmap (+) (Just 3)
>a <*> (Just 6)
Just 9
>Nothing <*> (Just 6)
Nothing

Applicativeのインスタンスは、Maybeだけでなく、リストなどもある。

リストの中身に関数を持てる場合、どうなるか、と考えていく。

|

« Haskell Functor type class | トップページ | Haskell Applicative Monoid »

Haskell」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1049865/39648755

この記事へのトラックバック一覧です: Haskell Functor type class 2:

« Haskell Functor type class | トップページ | Haskell Applicative Monoid »