Тип, зависящий от пути Scala: проверка на ошибку типа

Я написал немного 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 выдает ошибку типа во время компиляции, тест даже не запустится.

Можно ли как-то вставить тест на ошибку компиляции? Или тот факт, что ошибки компиляции сами по себе являются проверкой правильности, означает, что это избыточная проверка (т.е. то, что я пытаюсь сделать, не имеет смысла)?

Спасибо


person laffoyb    schedule 22.07.2014    source источник
comment
Дубликат stackoverflow.com/questions/20114298/   -  person Miles Sabin    schedule 22.07.2014


Ответы (1)


Тест лишний. Одно из преимуществ строгой системы типов заключается именно в том, что если вы правильно спроектируете свои типы, код даже не будет компилироваться.

person Mario Camou    schedule 22.07.2014
comment
Вовсе нет... особенно при работе с классами типов может быть важно знать, что экземпляры не доступны для определенных типов. В этом случае вам необходимо убедиться, что соответствующее выражение на самом деле не компилируется. - person Miles Sabin; 22.07.2014
comment
@MilesSabin Я исправлен. Спасибо! - person Mario Camou; 22.07.2014