は、カテゴリの次の定義を考えてみましょう:高次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) }
}
}
しかし、これらは、(i)特定のタイプ(Int
)、および(ii)特定の機能(intG
)を超える定量化されていますのは、整数上の機能のために試してみましょう。だからここに私の質問です:どのくらい私は上記のテストを一般化の面で行くことができますか?つまり、任意のA => B
関数のジェネレータを作成し、それらをScalaCheckに提供することは可能でしょうか?
あなたの質問に対する正確な答えはわかりませんが、スカラズのモナド法のチェックを思い出させます。おそらく、あなたはhttps://github.com/scalaz/scalaz/blob/master/tests/src/test/scala/scalaz/MonadTest.scala –
おそらくhttp://stackoverflow.com/users/53013/danielからインスピレーションを得ることができます-c-sobralは答えを知っていますか? –
タイプが任意に選択された場合、ヒルベルトのイプシロンを介した普遍的な定量としてこれを見ることができます。 https://gist.github.com/2659013を参照してください。 –