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 件のコメント:
コメントを投稿