表达 Int 字段或参数永远不应该为负的最佳方式是什么?

首先想到的是类型上的注释,例如 case class Foo(x: Int @NotNegative) 。但是我必须发明我自己的注释,并且不会有任何编译时检查或任何东西。

有没有更好的办法?

最佳答案

为什么不使用单独的数据类型?

class Natural private (val value: Int) {
   require(value >= 0)

   def +(that:Natural) = new Natural(this.value + that.value)
   def *(that:Natural) = new Natural(this.value * that.value)
   def %(that:Natural) = new Natural(this.value % that.value)
   def |-|(that:Natural) = Natural.abs(this.value - that.value) //absolute difference

   override def toString = value.toString
}

object Natural {
  implicit def nat2int(n:Natural) = n.value
  def abs(n:Int) = new Natural(math.abs(n))
}

用法:
val a = Natural.abs(4711)
val b = Natural.abs(-42)
val c = a + b
val d = b - a  // works due to implicit conversion, but d is typed as Int
println(a < b) //works due implicit conversion

关于scala - 在 Scala 中表示值约束的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4491159/

10-11 16:49