我已经编写了一些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
在编译时抛出了类型错误,测试甚至无法运行。
无论如何都要为编译错误插入测试?或者编译错误本身是否正确性测试的事实意味着这是一个冗余的检查(即我试图做的事情没有意义)?
由于
答案 0 :(得分:0)
测试是多余的。强类型系统的一个优点就是这样,如果你正确地设计你的类型,代码甚至都不会编译。