【发布时间】:2014-06-11 06:52:10
【问题描述】:
给定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 and sequences in Scala 的答复,但我无法将其转换为 for-comphension。
【问题讨论】:
-
所以你想要一个
Try[Seq]还是你想要Seq[Try]?另外,Failure在第一种情况下是否会失败?空的Seq是Failure的同义词吗? -
好问题。我想
Try[Seq[Try[String]]]没有任何意义。您如何理解我提到的问题中的返回类型 - stackoverflow.com/questions/23265227/…? -
你为什么在你的第一个函数中将成功转化为尝试?
-
像这样投射 ADT 是很典型的,@AndreasNeumann。可以说,ML/OCaml 和 Haskell 是自动完成的;例如
Just 3的类型在 Haskell 中是Maybe Int; Scala 没有真正的 ADT,因此需要显式强制转换来模仿这些语义。
标签: scala for-comprehension flatmap