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

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验证约束应用这样一个约束的最佳方式吗?谢谢

  • 据说比monad更强大,因为它可以累积错误。 有没有什么场合你可能会选择< code>Try而不是< code>scalaz。验证或< code>scalaz。\/?

  • 我正在尝试模拟我与外部API的交互,该API检查令牌以查看用户是否有权执行某些操作(它目前是一个单独的API作为PoC,稍后将移动到中间件中) 受抚养人(SBT DSL) 测试 代码 代码使用了一个MyHandler类,该类扩展了trait : 错误 当我运行代码时,我看到以下错误: 我如何确保我可以: a)将身份验证代码移动到MyHandler中,并使用Specs2提供的Mockito对MyHa

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