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中是否有一个组合器,可以通过较少的通过次数使它更优雅,或者需要编写自定义函数?

最佳答案

首先,使用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

关于scala - 变换和展平析取表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29549331/

10-12 04:08