我正在编写我自己的类 Success 或 Error。我想创建一种从 Try
构建 SuccessOrError
的方法,然后使用 Try
而不是丑陋的 try-catch
平面 map 。但我被困在这一点上。我应该如何最好地编写一个函数 fromTry 以便能够像这样编写?
案例 SuccessOrError.Success(v) ⇒ SuccessOrError.fromTry(Try(f(v)))
enum SuccessOrError[+V]:
case Success(x: V) extends SuccessOrError[V]
case Error(e : Throwable) extends SuccessOrError[V]
def flatMap[Q](f: V ⇒ SuccessOrError[Q]): SuccessOrError[Q] =
this match
case SuccessOrError.Success(v) ⇒ try f(v) catch case NonFatal(e) => SuccessOrError.Error(e)
case SuccessOrError.Error(e) ⇒ SuccessOrError.Error(e)
object SuccessOrError:
def fromTry[Q](f: Try[Q]): SuccessOrError[Q] = ???
最佳答案
从 Try
转换为另一个错误模型是很常见的做法。也许考虑一下他们如何在 scala-cats 库中处理它作为灵感
/**
* Converts a `Try[A]` to a `Validated[Throwable, A]`.
*/
def fromTry[A](t: Try[A]): Validated[Throwable, A] =
t match {
case Failure(e) => invalid(e)
case Success(v) => valid(v)
}
/**
* Converts a `Try[A]` to a `Either[Throwable, A]`.
*/
def fromTry[A](t: Try[A]): Either[Throwable, A] =
t match {
case Failure(e) => left(e)
case Success(v) => right(v)
}
/**
* If the error type is Throwable, we can convert from a scala.util.Try
*/
def fromTry[A](t: Try[A])(implicit ev: Throwable <:< E): F[A] =
t match {
case Success(a) => pure(a)
case Failure(e) => raiseError(e)
}
注意在快乐和不快乐的情况下进行简单模式匹配的模式(不好的双关语,applogies),所以我们可以尝试模仿它
def fromTry[Q](f: Try[Q]): SuccessOrError[Q] =
f match {
case scala.util.Failure(e) => SuccessOrError.Error(e)
case scala.util.Success(v) => SuccessOrError.Success(v)
}
关于scala - 在 flatMap 中使用 Try,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66985079/