6

私は次のようなものを考え出そうとしています:

val s: Validation[String, Int] = 1.success
def s2(i: Int): Validation[String, Int] = i.success

val result = for {
  i <- s
  j <- List(1, 2)
  k <- s2(j)
} yield "fine";

上記のコードはコンパイルされず、構文的に意味がありません。

モナドの方法で検証のリストを実行しようとしています。どうすればそれを達成できますか?

4

2 に答える 2

8

の検証のリストがある場合は、それを次の使用Aのリストの検証に変えることができます。Asequence

List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 

(質問を正しく理解していれば)。だからあなたは得る

val result = for {
  i <- s
  k <- List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int] 
} yield "fine"
于 2011-08-10T13:23:09.897 に答える
4

副作用の検証を使用しているようです。これはその目的ではありません。戻り値は関数型プログラミングで使用します。

for 理解での検証は成功すると継続しますが、失敗すると中断し、失敗を返します。

scala> def g(i: Int): Validation[String, Int] = { 
          println(i); if(i % 2 == 0) i.success else "odd".fail 
       }
g: (i: Int)scalaz.Validation[String,Int]

scala> val result = for {
     |   i <- g(1)
     |   j <- g(2)
     | } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)

scala> val result = for {
     |   i <- g(2)
     |   j <- g(1)
     | } yield (i,j)
2
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)


scala> val result = for {
     |   i <- g(2)
     |   j <- g(2)
     | } yield (i,j)
2
2
result: scalaz.Validation[String,(Int, Int)] = Success((2,2))


scala> val result = for {
     |   i <- g(1)
     |   j <- g(1)
     | } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)
于 2011-08-10T20:01:01.567 に答える