2015年5月16日土曜日

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

Exercise3.9 foldRightを使ってリストの長さを計算せよ
def length[A](as:List[A]):Int=
 foldRight(as,0)((a,b)=>b+1)

Exercise3.10 リスト再帰の総称関数foldLeftを記述せよ。
def foldLeft[A,B](as:List[A],z:B)(f:(B,A)=>B):B =
 as match {
      case Nil => z
      case Cons(x, xs) =>      f(foldLeft(xs, z)(f),x)
    }
これで、求められるけれど、末尾再帰でないので、だめなようだ。
あくまで、最後はfoldLeftの形でないとだめなので、正しい答は
def foldLeft[A,B](l: List[A], z: B)(f: (B, A) => B): B = l match {
  case Nil => z
  case Cons(x,xs) => foldLeft(xs, f(z,x))(f)
}

0 件のコメント:

コメントを投稿