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