Scala中的功能断言

Fel*_*lix 4 assert functional-programming scala

是否内置支持返回结果的断言?

这样做是非常不起作用的:

  def addPositive(a: Int, b: Int) = {
    assert(a > 0 && b > 0)
    a + b
  }
Run Code Online (Sandbox Code Playgroud)

我宁愿做类似的事情:

  def addPositive(a: Int, b: Int) = 
    assert(a > 0 && b > 0)(a + b)
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我可以避免断言的必要方面.(后者不编译)有类似的可用吗?

Mar*_*ila 15

函数式编程将函数视为纯数学函数(理想情况下).那么数学的一种方式是说某个函数对某些参数不起作用并且必须爆炸?

部分功能

事实证明,Scala对这个概念有很好的支持:PartialFunction.这是使用部分函数重写代码的方法:

val addPositive: PartialFunction[(Int, Int), Int] = {
  case (a, b) if a > 0 && b > 0 => a + b
}
Run Code Online (Sandbox Code Playgroud)

这有几个好处:

如果使用错误的参数调用它,则会抛出MatchError异常.

addPositive(-1, 2) => Exception in thread "main" scala.MatchError: (-1,2) (of class scala.Tuple2$mcII$sp)
Run Code Online (Sandbox Code Playgroud)

您实际上可以对函数的域进行采样,以检查某些值是否适合作为函数的参数:

addPositive.isDefinedAt(-1, 2) => false
Run Code Online (Sandbox Code Playgroud)

如果您希望将函数应用于某些参数并获得结果或某个值指示失败,lift则可以返回该函数Option

addPositive.lift(-1, 2) => None
addPositive.lift(1, 2) => Some(12)
Run Code Online (Sandbox Code Playgroud)

您可以将其与其他函数组合以在无效参数的情况下提供回退:

val fallback: PartialFunction[(Int, Int), Int] = { case (a, b) => Int.MinValue }
val f = addPositive orElse fallback

f(-1, 2) => -2147483648
Run Code Online (Sandbox Code Playgroud)

或者以自定义方式处理错误:

val raiseError: PartialFunction[(Int, Int), Int] = {
  case (a, b) => throw new IllegalArgumentException(s"Cannot apply addPositive to arguments $a and $b")
}
val g = addPositive orElse raiseError

g(-1, 2) => Exception in thread "main" java.lang.IllegalArgumentException: Cannot apply addPositive to arguments -1 and 2
Run Code Online (Sandbox Code Playgroud)

它适用于标准的lib:see Seq.collectSeq.collectFirst.

也是PartialFunction一个普通的一元函数,所以你也继承了所有的函数操作.

这篇文章解释了Scala中非常优雅的部分函数:

Scala部分功能(没有博士学位)