2016-04-26 16 views
3

私はsequenceUを使って、scalazの論理和を使って作業しているときに型を入れ替えます。sequenceタプルでの論理和のリスト

私はval res2 = List[(\/[Errs,MyType], DefModel)]持っている場合

res.sequenceU今すぐ\/[Errs,List[MyType]]

を与えること

val res = List[\/[Errs,MyType]] - 選言のタプルを含むListを。コメントで述べたように\/[Errs,List[ (Mype,DefModel)]

+0

'res2.map {case(d、m)=> d.map((_、m)}} .sequenceU' work? –

+0

'map {...} .sequenceU'の代わりに' traverseU {...} 'を使って単純化することができます。 –

答えて

5

res2を変換する正しい方法は何だ、これを書くための最も簡単な方法は、ちょうどtraversemapで、おそらくです:

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インスタンスが構成しているという事実を利用することができます。

関連する問題