Scala 从类和伴随对象实例化某些内容之间的区别

Scala 从类和伴随对象实例化某些内容之间的区别,scala,scalacheck,property-based-testing,Scala,Scalacheck,Property Based Testing,我正在阅读和练习Scala函数编程一书中的练习。在关于属性测试的一章中,有一个练习要求实现def listOf[A](g:Gen[A]):SGen[List[A],以下是相关代码: case class Gen[+A](sample: State[RNG, A]) { def flatMap[B](f: A ⇒ Gen[B]): Gen[B] = Gen(sample.flatMap(f(_) sample)) /* A method alias for the functi

我正在阅读和练习Scala函数编程一书中的练习。在关于属性测试的一章中,有一个练习要求实现
def listOf[A](g:Gen[A]):SGen[List[A]
,以下是相关代码:

case class Gen[+A](sample: State[RNG, A]) {

  def flatMap[B](f: A ⇒ Gen[B]): Gen[B] =
    Gen(sample.flatMap(f(_) sample))

  /* A method alias for the function we wrote earlier. */
  def listOfN(size: Int): Gen[List[A]] =
    Gen.listOfN(size, this)

  def listOfN(size: Gen[Int]): Gen[List[A]] =
    size flatMap (Gen listOfN (_, this))
}

object Gen {
  def listOfN[A](n: Int, g: Gen[A]): Gen[List[A]] =
    Gen(State.sequence(List.fill(n)(g.sample)))

  def listOf[A](g: Gen[A]): SGen[List[A]] =
  //  SGen { n ⇒ g.listOfN(n) }
  //  SGen{listOfN(_, g)}
}

case class SGen[+A](forSize: Int ⇒ Gen[A])
如您所见,
listOf[A](g:Gen[A]):SGen[List[A]
有两种实现方式,第二种是我认为的,第一种是本书提供的解决方案


我的问题是,通过伴生对象创建
SGen
和使用生成器
g
上的
listOfN
方法创建它之间有什么区别吗?我想,只要两个实现最终都使用
g
生成值,就没有什么区别。

在这个示例中实际上没有什么实际区别。您可以从实现中看到,
Gen.listOfN(size:Int)
只是在调用伴随对象实现。方法别名的优点之一是,您可以在伴随对象中使用更简单的语法,如下所示:

object Gen {
    ...
    def listOf[A](g: Gen[A]): SGen[List[A]] =
        SGen(g.listOfN)
}

当用户制作更大的合成时,使用这些不同的语法选项会对清晰度产生更大的影响。

谢谢,这可能是有显著不同的示例吗?