関数合成の話がTLであったので書いてみる。
最近だとゆろよろさんの記事が面白い。
http://d.hatena.ne.jp/yuroyoro/20120203/1328248662
http://d.hatena.ne.jp/yuroyoro/20120206/1328513534
Category
とりあえずCategoryから。
Categoryとか知らない人は
https://github.com/quassia88/introduction-to-category-theory-in-scala-jp/wiki
を見て、なんとなく分かってみてください。
この圏論入門の記事だとCategoryのインスタンスはFunctionしか書いてなくて、抽象化をしていることがわかりにくいですが、ScalazではCategoryのインスタンスにFunction, PartialFunction, Kleisliがあります。
※コード例はScalaz7
idが恒等関数、composeが合成関数です。
>>>, <<<というシンタックスもあります。
Arrow
究極的には関数合成だけでプログラムを書くこともできますが、>>>だけではなかなか難しいところがあります。
そこで登場するものが***と&&&。
この2つは関数を並列に合成します。
***はA => BとC => Dから(A, C) => (B, D)を返します。
&&&はA => BとA => CからA => (B, C)を返します。
関数合成を意識して、n番目のフィボナッチ数を得る関数を書いてみます。
|>はパイプ演算子と言われるもので、値を関数に適用するものです。
並列合成の使いどころは、ある値を複数回使うときです。
ScalazではTupleでfoldが使えるので別々に計算したものを簡単にまとめることが出来ます。
Scalaでも、Let's point free!
0 件のコメント:
コメントを投稿