考慮一個類別的定義如下:高階ScalaCheck
trait Category[~>[_, _]] {
def id[A]: A ~> A
def compose[A, B, C](f: A ~> B)(g: B ~> C): A ~> C
}
下面是一元函數實例:
object Category {
implicit def fCat = new Category[Function1] {
def id[A] = identity
def compose[A, B, C](f: A => B)(g: B => C) = g.compose(f)
}
}
現在,種類都受到一些法律。關於成分(.
)和身份(id
):
forall f: categoryArrow -> id . f == f . id == f
我想ScalaCheck對此進行測試。讓我們嘗試對功能在整數:
"Categories" should {
import Category._
val intG = { (_ : Int) - 5 }
"left identity" ! check {
forAll { (a: Int) => fCat.compose(fCat.id[Int])(intG)(a) == intG(a) }
}
"right identity" ! check {
forAll { (a: Int) => fCat.compose(intG)(fCat.id)(a) == intG(a) }
}
}
但是,這些被量化過(我)特定類型(Int
),及(ii)特定功能(intG
)。所以這裏是我的問題:在推廣上述測試方面我能走多遠,以及如何?或者換句話說,是否可以創建任意A => B
函數的生成器,並將這些函數提供給ScalaCheck?
我不知道你的問題的確切答案,但它讓我想起了scalaz中單子法的檢查。也許你可以從https://github.com/scalaz/scalaz/blob/master/tests/src/test/scala/scalaz/MonadTest.scala –
獲取靈感,也許http://stackoverflow.com/users/53013/daniel -c-sobral知道答案嗎? –
如果類型是任意選擇的,那麼您可以將其視爲通過Hilbert's epsilon的通用量化。請參閱https://gist.github.com/2659013。 –