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

撰写Scalaz验证

发布时间:2020-12-16 09:22:54 所属栏目:安全 来源:网络整理
导读:我想使用Scalaz进行验证,并希望能够在不同的上下文中重用验证函数.我是全新的Scalaz btw. 假设我有这些简单的检查: def checkDefined(xs: Option[String]): Validation[String,String] = xs.map(_.success).getOrElse("empty".fail)def nonEmpty(str: Strin
我想使用Scalaz进行验证,并希望能够在不同的上下文中重用验证函数.我是全新的Scalaz btw.

假设我有这些简单的检查:

def checkDefined(xs: Option[String]): Validation[String,String] =
  xs.map(_.success).getOrElse("empty".fail)

def nonEmpty(str: String): Validation[String,String] =
  if (str.nonEmpty) str.success else "empty".fail

def int(str: String): Validation[String,Int] = ...

我喜欢能够组合验证,其中一个的输出被馈送到另一个.我可以很容易地用flatMap或者通过理解来做,但是觉得一定要有比这更好的方法.

for {
  v1 <- checkDefined(map.get("foo"))
  v2 <- nonEmpty(v1)
  v3 <- int(v2)
  v4 <- ...
} yield SomeCaseClass(v3,v4)

要么

val x1 = checkDefined(map get "foo").flatMap(nonEmpty).flatMap(int)
val x2 = check(...)

// How to combine x1 and x2?

来自Scalaz专家的任何想法呢?

解决方法

除了@oxbow_lakes提出的解决方案外,您还可以使用Kleisli组合.

scala> import scalaz._,Scalaz._
import scalaz._
import Scalaz._

scala> def f: Int => Validation[String,Int] = i => if(i % 2 == 0) Success(i * 2) else    Failure("Odd!")
f: Int => scalaz.Validation[String,Int]

scala> def g: Int => Validation[String,Int] = i => if(i > 0) Success(i + 1) else Failure("Not positive!")
g: Int => scalaz.Validation[String,Int]

scala> type Va[+A] = Validation[String,A]
defined type alias Va

scala> import Validation.Monad._
import Validation.Monad._

scala> kleisli[Va,Int,Int](f) >=> kleisli[Va,Int](g)
res0: scalaz.Kleisli[Va,Int] = scalaz.Kleislis$$anon$1@4fae3fa6

scala> res0(11)
res1: Va[Int] = Failure(Odd!)

scala> res0(-4)
res2: Va[Int] = Failure(Not positive!)

scala> res0(4)
res3: Va[Int] = Success(9)

类型A =>的函数M [B]其中M:Monad被称为Kleisli箭头.

你可以组成两个Kleisli箭头A => M [B]和B => M [C]得到箭头A => M [C]使用> =>操作符.这被称为Kleisli组合.

表达式kleisli(f)> => kleisli(g)> => kleisli(h)等价于x =>对于(a <-f(x); b (a);>

http://stackoverflow.com/questions/9428174/compose-scalaz-validations

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:撰写Scalaz验证

(编辑:李大同)

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

    推荐文章
      热点阅读