2015年5月24日日曜日

scala関数型デザイン&プログラミング P86~87

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

コメントを投稿