我在使用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)]
答案 0 :(得分:5)
正如评论中所指出的,最直接的方法是使用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类型。