考虑一个类别的定义如下:高阶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。 –