加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scalaz验证,验证内在价值

发布时间:2020-12-16 10:02:10 所属栏目:安全 来源:网络整理
导读:我有一个Validation对象 val v = Validation[String,Option[Int]] 我需要进行第二次验证,以检查实际的Integer值是否等于100.如果我做 val vv = v.map(_.map(intValue = if (intValue == 100) intValue.success[String] else "Bad value found".fail[Integer]
我有一个Validation对象

val v = Validation[String,Option[Int]]

我需要进行第二次验证,以检查实际的Integer值是否等于100.如果我做

val vv = v.map(_.map(intValue => if (intValue == 100) 
                               intValue.success[String] 
                           else 
                               "Bad value found".fail[Integer]))

我明白了:

Validation[String,Option[Validation[String,Int]]]

怎样才能以最简洁的方式将vv作为Validation [String,Option [Int]]

=========

从我自己找到可能的解决方案:

val validation: Validation[String,Option[Int]] = Some(100).success[String]

val validatedTwice: Validation[String,Option[Int]] = validation.fold(
  _ => validation,// if Failure then return it
  _.map(validateValue _) getOrElse validation  // validate Successful result
)

def validateValue(value: Int): Validation[String,Option[Int]] = {
  if (value == 100)
    Some(value).success[String]
  else
    "Bad value".fail[Option[Int]]
}

尽管它有效但看起来并不简洁优雅

==============

我自己的第二个解决方案,但也看起来过于复杂:

val validatedTwice2: Validation[String,Option[Int]] = validation.flatMap(
    _.map(validateValue _).map(_.map(Some(_))) getOrElse validation)

def validateValue(value: Int): Validation[String,Int] = {
    if (value == 100)
      value.success[String]
    else
      "Bad value".fail[Int]
}

解决方法

您的解决方案过于复杂.以下就足够了!

v flatMap (_.filter(_ == 100).toSuccess("Bad value found"))

toSuccess来自OptionW,并将Option [A]转换为Validation [X,A],在选项为空的情况下获取为失败案例提供的值. flatMap的工作方式如下:

Validation[X,A] 
          => (A => Validation[X,B]) 
                                => (via flatMap) Validation[X,B]

也就是说,flatMap映射然后展平(加入scalaz-parlance):

Validation[X,A]
          => (A => Validation[X,B]]
                            => (via map) Validation[X,Validation[X,B]]
                                                  =>  (via join) Validation[X,B]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读