Hãy xem xét các định nghĩa sau đây của một thể loại:cao theo thứ tự ScalaCheck
trait Category[~>[_, _]] {
def id[A]: A ~> A
def compose[A, B, C](f: A ~> B)(g: B ~> C): A ~> C
}
Dưới đây là một ví dụ cho các chức năng unary:
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)
}
}
Bây giờ, danh mục này tùy thuộc vào một số luật. Liên quan tổng hợp (.
) và bản sắc (id
):
forall f: categoryArrow -> id . f == f . id == f
Tôi muốn thử nghiệm này với ScalaCheck. Chúng ta hãy thử cho các chức năng trên số nguyên:
"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) }
}
}
Nhưng chúng được định lượng trên (i) một loại hình cụ thể (Int
), và (ii) một chức năng cụ thể (intG
). Vì vậy, đây là câu hỏi của tôi: làm thế nào đến nay tôi có thể đi về tổng quát các bài kiểm tra ở trên, và làm thế nào? Hay nói cách khác, liệu có thể tạo ra một máy phát điện có chức năng tùy ý A => B
và cung cấp các chức năng đó cho ScalaCheck không?
Tôi không biết câu trả lời chính xác cho câu hỏi của bạn, nhưng nó nhắc tôi về việc kiểm tra các quy tắc đơn lẻ trong đại lượng. Có lẽ bạn có thể lấy cảm hứng từ https://github.com/scalaz/scalaz/blob/master/tests/src/test/scala/scalaz/MonadTest.scala –
có lẽ http://stackoverflow.com/users/53013/daniel -c-sobral biết câu trả lời? –
Nếu loại được chọn tùy ý thì bạn có thể xem đây là định lượng phổ thông qua epsilon của Hilbert. Xem https://gist.github.com/2659013. –