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)]
如评论中所述,最直接的写法可能就是 traverse
和 map
:
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 类型。
在 scalaz 中处理析取时,我使用 sequenceU
将内部类型转出。
例如
val res = List[\/[Errs,MyType]]
做
res.sequenceU
会给出 \/[Errs,List[MyType]]
现在,如果我有一个包含析取元组的 val res2 = List[(\/[Errs,MyType], DefModel)]
- List
;正确的转换方式是什么
res2
到 \/[Errs,List[ (Mype,DefModel)]
如评论中所述,最直接的写法可能就是 traverse
和 map
:
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 类型。