gpt4 book ai didi

scala - 为什么 OptionT 不适用于 Try?

转载 作者:行者123 更新时间:2023-12-01 08:54:59 26 4
gpt4 key购买 nike

我是从 Scala 和 Scalaz 的角度来看这个问题的。 OptionT 适用于 Future 但不适用于 TryTry 没有 OptionT 的原因是什么,其中有一个用例函数,即 def foo(i: Int): Try[Option[Int]] = ... 有没有返回值,偶尔会出现网络异常?谢谢

最佳答案

原因是Try isn't a valid functor .

您需要使用 scalaz-outlaws 或编写您自己的 Try 实例。这是一个使用 scalaz-outlaws' Try instances 的工作示例:

import scala.util.{Try,Success,Failure}
import scalaz._
import Scalaz._

implicit val tryOutlawInstances = new Traverse[Try] with Monad[Try] with Plus[Try]{
def point[A](a: ⇒ A): Try[A] = Success(a)
override def map[A,B](fa: Try[A])(f: A ⇒ B) = fa map f
def bind[A,B](fa: Try[A])(f: A ⇒ Try[B]) = fa flatMap f
def traverseImpl[F[_], A, B](fa: Try[A])(f: A ⇒ F[B])(implicit F: Applicative[F]) : F[Try[B]] = fa match {
case Success(a) ⇒ F.map(f(a))(Success.apply)
case Failure(f) ⇒ F.point(Failure(f))
}
def plus[A](a: Try[A], b: ⇒ Try[A]) = a orElse b
}

val foo = Try("foo".some)
val result = OptionT(foo).map(x => x.toUpperCase).run

关于scala - 为什么 OptionT 不适用于 Try?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42918296/

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