如何正确地组成验证,分离和期货

时间:2015-07-28 09:19:44

标签: scala scalaz monad-transformers

我必须调用2个函数,第一个返回一个\ / [String,Int],另一个返回Future [Int]。

我需要累积这2个函数调用的验证。

这是我的尝试:

import scala.concurrent.Future
import scalaz._, Scalaz._, Validation._

import scala.concurrent.ExecutionContext.Implicits.global

def positive(x: Int): \/[String,Int] = if(x<0) "ko".left else x.right

def inc(x: Int): Future[Int] = if (x >5) Future.successful(x +1) else Future.failed(new Exception("failed"))                                              

def eval(x:Int, y:Int): Future[Validation[String, (Int, Int)]] = for {
  v1 <- Future.successful(positive(x).validation)
  v2 <- inc(y).map(x => success(x)).recover{case ex: Exception => failure(ex.getMessage)}
} yield ((v1 |@| v2){(_,_)})

)是否有更简单的方法来避免将未来错误手动绑定到成功/失败?

2)我想使用ValidationNel来累积错误消息(现在我检索消息,如&#34;失败(kofailed)&#34;只有两条消息的串联)但我不# 39;不知道是否可以从\ /类型获得ValidationNel。

0 个答案:

没有答案