2015年5月28日木曜日

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

Exersise 5.12 unfoldを使ってmap,take,takeWhile,zipWith,zipAllを実装せよ。zipAll関数ではどちらかのストリームに要素が残っている限り、評価を続ける必要がある。(ストリームが完全に評価されたかどうかを示すのにOptionを使用する)

 def map3[B](f:A=>B):Stream[B] =
unfold(this)( p=>p match {case Cons(a,as)=>Some(f(a()),as())
 case _ => None
   })
省略形にすると
 def map4[B](f:A=>B):Stream[B] =
   unfold(this) {case Cons(a,as)=>Some(f(a()),as())
                 case _ => None
}


def take2(n:Int):Stream[A]=
   unfold((this,n)) {
  case (Cons(a,as),n) if (n>0) => Some( (a(),(as(),n-1))   )
  case _ => None
}


def takeWhile4(p:A=>Boolean):Stream[A] =
  unfold(this) {
  case (Cons(a,as)) if (p(a())) => Some(a(),as())
  case _ => None
  }

def zipWith2[A](as:Stream[A],bs:Stream[A])(f:(A,A)=>A):Stream[A]=
  unfold(as,bs) {
  case (Cons(a,as),Cons(b,bs)) => Some(f(a(),b()),(as(),bs()))
  case (_,_)=>None
}


def zipAll[B](s2:Stream[B]):Stream[(Option[A],Option[B])] =
  unfold(this,s2) {
  case (Cons(a,as),Cons(b,bs)) => Some((Some(a()),Some(b())),(as(),bs()))
ここで、はたと止まってしまった。
 case(Empty,Cons(b,bs))=>Some、、、、のところがどうしてもうまくいかない。
解答のプログラムもコンパイルしてみたが、エラーが発生する。


0 件のコメント:

コメントを投稿