def sequence[E,A](es:List[Either[E,A]]):Either[E,List[A]]=
es match {
case Nil => Right(Nil)
case x::xs => x flatMap(xx => sequence(xs) map(xx::_) )
}
def traverse[E,A,B](as:List[A])(f:A=>Either[E,B]):Either[E,List[B]] =
as match {
case Nil => Right(Nil)
case h::t => f(h).map2(traverse(t)(f))(_::_)
}
としてみた。
解答には
def sequence_1[E,A](es: List[Either[E,A]]): Either[E,List[A]] =
traverse(es)(x => x)
のように、sequenceはtraverseを使う方法がでていた。
ただ、使い方がいまひとつわからなかった。
val ls=List(Right(1),Right(2))
val l=List(1,2)
val el=Right(List(3,4))
println(el.traverse(l)(i=>Right(i*2)))
println(el.sequence(ls))
println(el.sequence_1(ls))
のように、elをつけないと実行できない。実際にはlやlsしか使ってないのだが。。。基本的なことなんだろうが、勉強不足。
0 件のコメント:
コメントを投稿