High-Order 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?

17
задан Hugo Sereno Ferreira 9 May 2012 в 23:20
поделиться