Я написал немного Scala для работы с модульной арифметикой, используя типы, зависящие от пути. Родительский класс представляет группу по модулю некоторого целого числа, а внутренний класс представляет элементы этой группы.
class ModularInt( modulus : Int ) {
case class Value( value: Int ) {
def plus( a: Value ) : Value = {
val rem: Int = (value + a.toInt) % modulus
if( rem < 0 )
Value(modulus + rem)
else
Value(rem)
}
def toInt = value
}
}
Кажется, это работает правильно (например, по модулю 7: 6 + 2 = 1).
Приятным побочным эффектом использования типов, зависящих от пути, является то, что числа по модулю различных целых чисел будут вызывать ошибку типа, если вы попытаетесь оперировать ими вместе. Однако я хотел бы вставить тест, который подтвердит этот факт.
import org.scalatest.FunSuite
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class ModularIntSuite extends FunSuite {
test("a mod n + b mod m => error") {
val n: Int = 3
val m: Int = 4
val modulen = new ModularInt( n )
val modulem = new ModularInt( m )
val a = new modulen.Value(0)
val b = new modulem.Value(0)
assert(a plus b) // catch error here
}
}
Однако, поскольку a plus b
выдает ошибку типа во время компиляции, тест даже не запустится.
Можно ли как-то вставить тест на ошибку компиляции? Или тот факт, что ошибки компиляции сами по себе являются проверкой правильности, означает, что это избыточная проверка (т.е. то, что я пытаюсь сделать, не имеет смысла)?
Спасибо