【发布时间】:2015-12-07 17:41:43
【问题描述】:
假设我有两个计算结果列表
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]
【问题讨论】:
标签: scala functional-programming scalaz applicative either