2015年5月17日日曜日

scala関数型デザイン&プログラミング P57

Exercise 3.29 size,maximum,depth,mapを一般化し、それらの類似点を抽象化する新しいfold関数を記述せよ。
def fold[A,B](t:Tree[A])(lf:A=>B,bf:(B,B)=>B):B=
 t match {
   case Leaf(a) =>lf(a)
   case Branch(lt,rt)=>bf(fold(lt)(lf,bf),fold(rt)(lf,bf))
 }
 size,maximum,depth,mapの類似点は、
1)t:Tree[A]が引数で、match式で使われていること
2)case Leaf(a)の右側がaの関数と考えられる
 このaの関数lfがいろいろ変えることで、一般化できる。このlfをfoldの引数にしてやるとよい。
3)case Branch(lt,rt)の右側がlt,rtを引数とした再帰関数の関数と考えられる
 このlt,rtを引数とした再帰関数は、どれにも共通しているので、これらfold(lt)(lf,bf)とfold(rt)(lf,bf)を引数としたbfという関数をいろいろ変えることで、一般化できる。それで、このbfもfoldの引数にする。

関数を引数にできると、プログラムの抽象化の幅も広がるということがこの練習問題からよくわかります。

0 件のコメント:

コメントを投稿