序列与元组分离的列表

Vik*_*dya 3 scala scalaz

sequenceU在scalaz中使用disjunctions时用来转换内部类型.

例如

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

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

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

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

Tra*_*own 5

正如评论中所指出的,最直接的写作方式可能就是traversemap:

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

但值得注意的是,元组本身是可遍历的,因此以下内容是等效的:

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

请注意,如果分离位于元组的右侧,这将更加简单.如果您愿意进行更改,您还可以更方便地利用Traverse实例组成的事实:

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

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