2016-12-27 4 views
1

나는 합계하고자하는 유형 List[Result[BigDecimal]] 목록이 있습니다.Scalaz의 OptionT [Future, BigDecimal] 목록 합계

type Result[A] = OptionT[Future, A]

규칙은 Future(None)이 있다면 우리는 결과 Future(None)를 얻을 것입니다.

def sum[A: Monoid](as: List[A]): A = { 
    val M = implicitly[Monoid[A]] 
    as.foldLeft(M.zero)(M.append) 
} 

는 그러나, 나는 Result[BigDecimal]Monoid 인스턴스를 잃었 :

나는 기능 [1]이있다. Scalaz을 사용하여 어떻게 정의합니까? Scalaz 제공하지 않는 이유

learning Scalaz - sum function

답변

2

는 잘 모르겠어요이 인스턴스가 제공 않는 A가 모노 이드 인스턴스를 가지고 있으며, 범위 암시 실행 컨텍스트가 어디 Monoid[Future[A]]. 당신은 쉽게 만들 수 있습니다 자신하지만, 중 단지 바로 하나를 정의하여 [이 실제로 원하는 의미가없는 것] IsomorphismMonoid, 또는를 사용하여 ResultFuture[Option[?]] 다음과 동형 사상을 정의하여 :

import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.Future 
import scalaz._, Scalaz._ 

type Result[A] = OptionT[Future, A] 

implicit def resultMonoid[A: Monoid]: Monoid[Result[A]] = new Monoid[Result[A]] { 
    def zero: Result[A] = Monoid[A].zero.point[Result] 
    def append(f1: Result[A], f2: => Result[A]): Result[A] = (f1 |@| f2)(_ |+| _) 
} 

그것은 가치가 무엇인지에 대한

scala> List(OptionT(Future(1.some)), OptionT(Future(2.some))).suml 
res1: scalaz.OptionT[scala.concurrent.Future,Int] = OptionT(List()) 

scala> scala.concurrent.Await.result(res1.run, scala.concurrent.duration.Duration.Inf) 
res2: Option[Int] = Some(3) 

, Cats provides this instance하지만 (Scalaz의 Future[Option[?]] 경우 등)는 0123를 가지고 : 그리고 (Scalaz 자신의 suml하지만 sum가 잘 작동을 사용)을 ID로 사용하십시오.