假设我有两个计算结果列表
val a: List[ Throwable \/ A] = ...
val b: List[ Throwable \/ B] = ...
我有计算最终结果的函数,例如
def calc(a: A, b: B): Throwable \/ C = ...
我需要计算每个结果的所有结果,a
并且如果有的话b
还要累积。Throwable
有没有像 Applicative style 这样的优雅方式<*>
?
UPDT:结果必须如下
val c: List[ Throwable \/ C] ..
我来到的最好的解决方案是
def combine[A, B, C](f: (A, B) => Throwable \/ C, a: Throwable \/ A, b: Throwable \/ B): List[Throwable] \/ C = (a, b) match{
case ( -\/(errA), \/-(_)) => -\/(List(errA))
case (\/-(_), -\/(errB)) => -\/(List(errB))
case (-\/(errA), -\/(errB)) => -\/(List(errA, errB))
case (\/-(valA), \/-(valB)) => f(valA, valB).leftMap( List(_))
}
然后
val result = (a |@| b)(combine(calc, _, _))
但在那种情况下,我有一些额外的结果。结果列表有类型List[ List[Throwable] \/ C]