2014-07-22 151 views
1

我寫了一些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

重複http://stackoverflow.com/questions/20114298/how-do-i-write-a-scala-unit-test-that-ensures-compliation-fails –

回答

0

測試是多餘的。強類型系統的優點之一正是這一點,如果你正確地設計你的類型,代碼甚至不會編譯。

+3

一點都不......特別是在工作時對於類型類,知道實例對特定類型不可用是非常重要的。在這種情況下,您需要驗證相關表達式實際上並未進行編譯。 –

+0

@MilesSabin我站好了。謝謝! –