Pure, Functor, Pointed, Apply, Applicative, Bindを倒さないとMonadへはたどり着けない・・・・・
ということでFunctorの紹介。
Functor
Pureと同じように型パラメータを1つとる型を型パラメータにとります。
fmapというコレクションでおなじみのmapと似た関数を持っています。
mapと違うところは要素を包む型が多相であるというところです。
Identity
mapply
値を内包された関数に適用します。
MA
map, map2, >|
mapは関数を渡し、内包する値に適用します。
map2はFunctorがネストしている場合に利用でき、ma.map(_.map(f))と等価です。
>| は値を渡し、その値で塗りつぶします。
fpair, fpure
fpairは内包された値のペアを作ります。
fpureは内包された値を指定した型で包みます。
comp
Option[List[Int]]をMA[M[_], A]とみなすとき、MにOptionが、AにList[Int]が適用されMA[Option, List[Int]]となります。
compではMにOption[List[_]]を、AにIntを適用したMA[({ type X[A] = Option[List[A]] })#X, Int]を返します。
MAの型としては型の部分適用されたものが返るので普通の型クラスは対応していません。
しかしCompをインポートすることでApplicativeとFunctorのimplicit valueを得ることができます。
InvariantFunctor
FunctorはInvatiantFunctorを継承しています。
MA
xmap
一度別の型に変換し、また元の型へ変換します。
Semigroup以外に、Endo, Monoid, Memoのインスタンスが定義されています。
xmapはともかく、mapやmap2,compは使いどころが多いと思います。
積極的に使っていってコードをScalazで染め上げましょう!
0 件のコメント:
コメントを投稿