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/