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