2

および: foo_bar

scala> def foo: Try[Seq[String]] = Success(List("good", "job"))
foo: scala.util.Try[Seq[String]]

scala> def bar(x: String): Try[String] = Try(x)
bar: (x: String)scala.util.Try[String]

flatMapこれをに変換するにはどうすればよいfor-comprehensionですか?

scala> foo.flatMap(a => Try(a.map(c => bar(c))))
res48: scala.util.Try[Seq[scala.util.Try[String]]] = 
         Success(List(Success(good), Success(job)))

上記を Using for-comprehension, Try および Scalaでのシーケンスへの回答として提供したことに注意してくださいfor-comphension

4

2 に答える 2

1

できません。for-comprehension は、1 つの(またはすべての) 呼び出しが後に続く一連のflatMap呼び出しのみにすることができます。への呼び出しはチェーンを壊します。and の使用を取り除きますが、2 つの呼び出しを 1 つの for-comprehension にすることもできません。mapforeachTryTrymapmap

Try.flatMapに渡された関数で発生したエラーをキャッチするため、 の結果をflatMap呼び出すことで戻り値の型を単純化できます。getbar

foo.map(a => a.map(c => bar(c).get))

次のように 2 つをインデントすることで、単一の for-comprehension に非常に近づけることができます。

for {
  a <- foo
} yield for {
  c <- a
} yield bar(c).get

生成するもの:

res12: scala.util.Try[Seq[String]] = Success(List(good, job))
于 2014-04-26T02:20:50.100 に答える
0

これ:

foo.flatMap(a => Try(a.map(c => bar(c))))

次と同等です。

for {
  a <- foo
} yield a.map(c => bar(c))

map内部を同じ内包表記に「フラット化」するforことに関しては、結果を次のようにしたい場合 (つまり、 の 2 レベルTry)は意味がありません。

Success(List(Success(good), Success(job)))

私の直感では、代わりに to をフラット化することをお勧めしますが ( eg を使用List[Try[String]]) 、それは wingedsubmariner も示唆していると思います。List[String].map(_.toOption).flatten

于 2014-04-26T02:40:57.370 に答える