【问题标题】:Why OptionT does not work for Try?为什么 OptionT 不适用于 Try?
【发布时间】:2017-03-21 04:10:54
【问题描述】:

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

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    原因是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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多