2017-03-21 45 views
3

我在看从Scala和Scalaz角度这个问题。 OptionT作品Future但不Try。这是什么原因没有OptionTTry那里有一个用例的功能,即可以def foo(i: Int): Try[Option[Int]] = ...或不能返回值,偶尔网络异常会怎样呢?由于为什么OptionT不适用于Try?

回答

3

的原因是Try isn't a valid functor

你需要使用scalaz,歹徒或写自己的尝试实例。下面是使用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 
相关问题