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) 
+0

работал после небольшой настройки: результат в (...) не совпадает с типом возвращаемого, так что я должен был сделать это: result.fold (е => e.fail, х => x.liftFailNel) – Digal