Лучший способ представить ограничения на значения в Scala? - PullRequest
4 голосов
/ 20 декабря 2010

Каков наилучший способ выразить, что, скажем, поле или параметр Int никогда не должны быть отрицательными?

Первое, что приходит на ум, - это аннотация к типу, например case class Foo(x: Int @NotNegative),Но мне пришлось бы придумать свою собственную аннотацию, и не было бы никакой проверки во время компиляции или чего-то еще.

Есть ли лучший способ?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Почему бы не использовать отдельный тип данных?

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
1 голос
/ 20 декабря 2010

Контракты и инварианты в настоящее время не поддерживаются Scala.

1 голос
/ 20 декабря 2010

Немного лучше (?), Возможно, но все равно нет проверки компилятором: require(x >= 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...