Martin Odersky在线scala课程中的flatMap生成器

Martin Odersky在线scala课程中的flatMap生成器,scala,functional-programming,Scala,Functional Programming,目前我正在学习在线课程“反应式编程原理” Martin Odersky,Erik Meijer,Roland Kuhn一年前就已经结束了,我想在本课程的讨论论坛中没有人活跃,所以我把我的问题放在这里寻求帮助,非常感谢 在“函数随机生成器”课程中,Martin给出了生成器与flatMap方法的实现,如下所示: trait Generator[+T] { self => // an alias for "this" def generate: T def map[S](f: T

目前我正在学习在线课程“反应式编程原理” Martin Odersky,Erik Meijer,Roland Kuhn一年前就已经结束了,我想在本课程的讨论论坛中没有人活跃,所以我把我的问题放在这里寻求帮助,非常感谢

在“函数随机生成器”课程中,Martin给出了生成器与flatMap方法的实现,如下所示:

trait Generator[+T] {
  self => // an alias for "this"

  def generate: T

  def map[S](f: T => S): Generator[S] = new Generator[S] {
      def generate = f(self.generate)
  }

  def flatMap[S](f: T => Generator[S]): Generator[S] = new Generator[S] {
      def generate = f(self.generate).generate
  }
}
我不太清楚这里的flatMap,它返回一个新的生成器,带有定义的generate方法,但其实现依赖于输入函数参数f中的“other”生成器的“other”generate方法

以下是我的问题:

1) 输入函数f返回的生成器和此flatMap方法返回的生成器是否属于同一类型


2) 如果它们是相同的,那么既然generate方法是自己定义的,那么编译器是如何解释它的呢?

我想我得到了答案

1) 输入函数f中的生成器和flatMap方法返回的生成器属于相同的“抽象”类型,但它们的实例可能具有不同的子类型,因此“虚拟”生成方法不同

2) 输入函数f返回的生成器[S]的generate方法必须已在flatMap上下文中定义。它们是来自不同实类型的不同生成方法