2011-01-13 6 views
5

私は、私たちのプロジェクトでscalaz検証を使用しようとしていると、以下のような状況に遭遇している:いずれかがあった場合Scalaz検証

def rate(username: String, params: Map[String, String]): ValidationNEL[String, Int] = { 
    val voteV:Validation[String, RateVote] = validate(params, "vote") flatMap {v: String => RateVote(v)} 
    val voterV:Validation[String, Sring] = validate(params, "voter") 

    ... 
} 

は、今私は、可能なパラメータ誤差を含むValidationNELを返却する必要がある、または使用が検証さメソッドを呼び出すパラメータ:

storage.rate(username, voter, vote): Validation[String, Int] 

私は知っている、私は使用することができます| @ |最初の部分はこのコードですが、

(voterV.liftFailNel |@| voteV.liftFailNel) { (voter, rv) => 
    storage.rate(username, voter, rv) 
} 

ValidationNEL[String, Validation[String, Int]]を返します。 ValidationNEL[String, Int]を得るために、この結果を「平坦化」する方法はありますか?

答えて

10

折り畳みを使用して結果を平坦にすることができます。内部の結果(...)は、戻り値の型と一致していないので、私はこれを行う必要がありました:result.fold(E => e.fail、X => x.liftFailNelを少し調整した後、勤務

result.fold(e => e.fail, x => x.liftFailNel) 
+0

) – Digal