【发布时间】:2012-05-09 14:19:33
【问题描述】:
考虑以下类别的定义:
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?
【问题讨论】:
-
我不知道你的问题的确切答案,但它让我想起了 scalaz 中对单子定律的检查。或许你可以从github.com/scalaz/scalaz/blob/master/tests/src/test/scala/…获得灵感
-
如果类型是任意选择的,那么您可以通过希尔伯特的 epsilon 将其视为通用量化。见gist.github.com/2659013。
标签: scala specifications category-theory scalacheck