序列与元组分离的列表

时间:2016-04-26 02:34:33

标签: scala scalaz

我在使用scalaz中的disjunctions时使用sequenceU来输出内部类型。

例如。

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

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

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

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

1 个答案:

答案 0 :(得分:5)

正如评论中所指出的,最直接的方法是使用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类型。