に
res2
を変換する正しい方法は何だ、これを書くための最も簡単な方法は、ちょうど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))
分離がタプルの右側にあった場合、これはさらに簡単になることに注意してください。私はここで種類-プロジェクターを使用してい
def sequence(xs: List[(DefModel, \/[Errs, MyType])]): \/[Errs, List[(DefModel, MyType)]] =
Traverse[List].compose[(DefModel, ?)].sequenceU(xs)
いますが、型ラムダを書き出すことができます:あなたがその変更を行うために喜んでいる場合は、より便利Traverse
インスタンスが構成しているという事実を利用することができます。
'res2.map {case(d、m)=> d.map((_、m)}} .sequenceU' work? –
'map {...} .sequenceU'の代わりに' traverseU {...} 'を使って単純化することができます。 –