2011-01-13 28 views
5

Tôi đang cố gắng sử dụng xác nhận scalaz trong dự án của chúng tôi và đã chạy vào một tình huống sau đây:Scalaz xác nhận

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") 

    ... 
} 

Bây giờ tôi phải trở ValidationNEL chứa lỗi thông số có thể, nếu có bất kỳ, hoặc sử dụng xác nhận các tham số để gọi phương thức:

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

Tôi biết, tôi có thể sử dụng | @ | cho phần đầu tiên, nhưng mã này

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

sẽ trả lại ValidationNEL[String, Validation[String, Int]]. Có cách nào để "làm phẳng" kết quả này không, để lấy số ValidationNEL[String, Int]?

Trả lời

10

Bạn có thể làm phẳng kết quả bằng nếp gấp.

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

Làm việc sau khi điều chỉnh nhỏ: kết quả bên trong (...) không khớp với kiểu trả về, vì vậy tôi phải thực hiện điều này: result.fold (e => e.fail, x => x.liftFailNel) – Digal

Các vấn đề liên quan