sequence 与元组分离的列表

sequence List of disjunction with tuples

在 scalaz 中处理析取时,我使用 sequenceU 将内部类型转出。

例如

val res = List[\/[Errs,MyType]]

res.sequenceU 会给出 \/[Errs,List[MyType]]

现在,如果我有一个包含析取元组的 val res2 = List[(\/[Errs,MyType], DefModel)] - List;正确的转换方式是什么

res2\/[Errs,List[ (Mype,DefModel)]

如评论中所述,最直接的写法可能就是 traversemap:

def sequence(xs: List[(\/[Errs, MyType], DefModel)]): \/[Errs, List[(MyType, DefModel)]] =
  xs.traverseU { case (m, d) => m.map((_, d)) }

值得注意的是,元组本身是可遍历的,所以下面是等价的:

def sequence(xs: List[(\/[Errs, MyType], DefModel)]): \/[Errs, List[(MyType, DefModel)]] =
  xs.traverseU(_.swap.sequenceU.map(_.swap))

请注意,如果析取位于元组的右侧,这会更简单。如果您愿意进行更改,您还可以更方便地利用 Traverse 个实例组成的事实:

def sequence(xs: List[(DefModel, \/[Errs, MyType])]): \/[Errs, List[(DefModel, MyType)]] =
  Traverse[List].compose[(DefModel, ?)].sequenceU(xs)

我在这里使用 kind-projector 但你也可以写出 lambda 类型。