2015年5月24日日曜日

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

Exercise 4.7 Eitherでsequenceとtraverseを実装せよ

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

コメントを投稿