Exercise5.2 Streamの先頭からn個の要素を取り出す関数take(n)とn個の要素をスキップするdrop(n)関数を実装せよ
def take(n:Int):Stream[A] = this match {
case Cons(x,xs) if n>1 => cons(x(),xs().take(n-1))
case Cons(x,_) if n==1 => cons(x(),empty)
case Empty => Stream()
}
これをprintln(Stream(1,2,3,4).take(2).toList)で確認してみた
def drop(n:Int):Stream[A]=this match {
case Cons(x,xs) if n>0 => xs().drop(n-1)
case Cons(x,xs) if n==0 => cons(x(),xs())
case Empty => Stream()
}
println(Stream(1,2,3,4).drop(3).toList)で確認したが、これだと、無駄があったようだ。
def drop2(n: Int): Stream[A] = this match {
case Cons(_, t) if n > 0 => t().drop(n - 1)
case _ => this
}
解答はこうなっていた。
Exercise5.3 Streamの先頭から指定された述語とマッチする要素をすべて取り出す takeWhile関数を記述せよ
def takeWhile(f: A => Boolean): Stream[A] = this match {
case Cons(h,t) if f(h()) => cons(h(), t() takeWhile f)
case _ => empty
}
これは、なぜかprintln(Stream(1,2,3,4).takeWhile2(_>2).toList)とするとList()と表示される。
よく考えたら、先頭から~マッチしないとだめなわけだから、_>2でなく_<3などで試せばいいわけだ。
0 件のコメント:
コメントを投稿