2017-03-21 3 views
3

나는 스칼라와 스칼라즈의 각도에서이 질문을보고있다. OptionTFuture에서 작동하지만 Try에서는 작동하지 않습니다. 에 대해 이없는 이유는 무엇입니까? 예 : def foo(i: Int): Try[Option[Int]] = ...은 값을 반환하거나 반환하지 않을 수 있으며 때때로 네트워크 예외가 발생합니다. 감사합니다Try는 왜 작동하지 않습니다?

답변

3

이유는 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