gpt4 book ai didi

scala - 在 flatMap 中使用 Try

转载 作者:行者123 更新时间:2023-12-04 03:30:26 25 4
gpt4 key购买 nike

我正在编写我自己的类 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 库中处理它作为灵感

Validated

  /**
* 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)
}

Either

  /**
* 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)
}

ApplicativeError

  /**
* 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com