【问题标题】:Scala path-dependent type: testing for type error [duplicate]Scala路径相关类型:测试类型错误[重复]
【发布时间】:2014-07-22 14:49:57
【问题描述】:

我编写了一些 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 在编译时抛出类型错误,测试甚至不会运行。

是否有为编译错误插入测试?或者编译错误本身就是正确性测试这一事实是否意味着这是一个冗余检查(即我试图做的事情没有意义)?

谢谢

【问题讨论】:

标签: scala scalatest path-dependent-type


【解决方案1】:

测试是多余的。强类型系统的优点之一就是这样,如果你正确设计你的类型,代码甚至不会编译。

【讨论】:

  • 完全没有……尤其是在使用类型类时,知道实例可用于特定类型可能很重要。在这种情况下,您需要验证相关表达式实际上没有编译。
  • @MilesSabin 我的立场是正确的。谢谢!
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 2012-06-22
  • 2019-02-17
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多