case class Errs(errors: List[Err])
case class Err(exceptionMessage: String, customMessage: String, statusCode: Int, extraInfo: Option[String] = None)
返回val result = List[\/[Errs, Boolean]]
为了变换/排序和展平result
以下传递
val finalRes: \/[Errs, Boolean] = result.map(_.swap).sequenceU.map(x => Errs(x.map(_.errors).flatten)).swap
这看起来不够优雅且性能密集(给定通过多次map
次呼叫的通过次数等)
scalaz
中是否有一个组合器,可以通过较少的传递次数使这更优雅,或者这需要编写自定义函数?
答案 0 :(得分:0)
首先,按照Travis Brown的建议使用traverseU
。
之后,拨打map
后拨打flatten
的电话可以使用flatMap
写一次。
val finalRes: \/[Errs, Boolean] = result.traverseU(_.swap).map(x => Errs(x.flatMap(_.errors))).swap
此外,您可以考虑使用Errs
的类型别名。
type Errs = List[Err]
因此,代码更简单(减少装箱/拆箱):
val finalRes: \/[Errs, Boolean] = result.traverseU(_.swap).map(_.flatten).swap