2015年5月23日土曜日

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

Exercise4.5 traverse関数を実装せよ。リストを1回だけ調べる効率よい実装にすること。traverseの観点からsequenceを実装するとよい。

f(x):Option[B]だし、traverse()():Option[List[B]]なので
 x::xsから 最終的に map2(f(x),traverse(xs)(f))(_::_) にすればよさそうな気がしてた。
が、foldMapの使用も考えたりするうち、よくわからなくなり、正解を見た。
def traverse[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] =
  a match {
    case Nil => Some(Nil)
    case h::t => map2(f(h), traverse(t)(f))(_ :: _)
  }

別解は
def traverse_1[A,B](a:List[A])(f:A=>Option[B]):Option[List[B]]  =
 a.foldRight[Option[List[B]] ](Some(Nil))( (x,y) => map2(f(x),y)(_::_) )

0 件のコメント:

コメントを投稿