当前位置: 首页 > 知识库问答 >
问题:

Scala验证-右偏

宗政浩慨
2023-03-14

最后Scala 2.12也有右偏。我听说它可以用于验证目的,但我无法想象这一点。我找不到好的例子<谁能解释一下这个单子是如何帮助我进行验证的?此外,此增强功能还可以涵盖哪些其他用例?

共有1个答案

越信鸥
2023-03-14

[A, B]无论是否有右偏,都非常适合验证/异常处理。使其具有右偏使我们更容易对其进行操作。

假设我们要验证一个对象,验证方法可以采取什么形式?最简单的形式是谓词,一种接受任意对象并返回布尔值的方法:

sealed trait Base
case class Foo(I: Int)
case class Bar(s: String)

def isValid(b: Base): Bool = b match {
  case Foo(i) => i > 18
  case Bar(s) => s.length > 5
}

这将起作用,但有时可能还不够。如果这是一个面向API的用户,并且我们希望明确说明接收到的对象可能存在的错误,以便用户快速了解出了什么问题怎么办?

如果不是返回Bool,而是返回错误列表或返回有效对象本身,会怎么样?这将使我们能够进一步撰写:

def validate(b: Base): Either[List[String], Base] = b match {
  case Foo(i) => if (i > 18) Right(b) else Left(List("i must be greater than 18"))
  case Bar(s) => if (s.length > 5) Right(b) else Left(List("s must be longer than 5 chars"))
}

现在我们可以映射它:

val foo = Foo(42)
val result = validate(foo).map { case Foo(i) => s"yay, valid foo number: $i" } 
result match {
  case Left(errors) => println(s"Something went wrong: ${errors.mkString(", ")}")
  case Right(msg) => println(msg)
}

我们获得了两件事。首先是与其他操作组合验证并推迟错误处理的能力,其次是显式错误。我们甚至可以更进一步,将这些错误键入,允许用户匹配它们并为每个用例应用错误处理,但那是另一次了。

 类似资料:
  • scala支持JSR-303验证吗? 如果是的话,你能写一个例子吗? 如果没有-是否有变通方法在scala类上运行JSR-303验证?

  • 接口说明 验证验证码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /authcenter/api/verify/v1.0.0/check

  • 我需要应用一个双值验证,这需要与圆周率匹配。我正在考虑使用@pattern(regex=“3.14159265359”)。这是使用Hibernate验证约束应用这样一个约束的最佳方式吗?谢谢

  • 是否可以以与选项类似的方式处理任一选项?在

  • 我现在把这两者搞混了。我知道Hibernate Validator6是Bean验证2.0规范的参考实现。它支持分组、错误消息国际化、自定义方法验证等。问题是Spring5支持这些特性还是我只剩下Hibernate Validator6了? 网上所有的参考例子都建议使用Hibernate验证器,没有什么关于Spring验证的发现,请建议或指向其他链接。

  • 我有以下场景:我正在尝试处理一个表单,模型属性是一个具有String和Long属性的bean。众所周知,bean验证提供了很多注释来帮助我们确定数据的有效性。我面临的是,对于Long属性的情况,我只能使用@NotNull和另一个注释(我不记得它的名字)来强制用户输入正数。如果用户输入例如“sdf”,应用程序会抛出一个BIG异常。所以我想知道的是,如果用户在爆炸前输入了一个数字(因为我不能使用@Pa