撰写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
http://stackoverflow.com/questions/9428174/compose-scalaz-validations
本站文章除注明转载外,均为本站原创或编译 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |