我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)]
正如评论中所指出的,最直接的写作方式可能就是traverse和map:
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类型.
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |