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



目前我正在学习在线课程"响应式编程原理"作者: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,它返回了一个带有定义的生成方法的新生成器[S],但其实现依赖于输入函数参数 f 中的"其他"生成器 [S] 中的"其他"生成方法。

以下是我的问题:

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

2)如果它们相同,编译器如何解释生成方法,因为它是由自己定义的?

我想

我得到了答案

1) 来自输入函数 f 的生成器 [S] 和由 flatMap 方法返回的生成器 [S] 属于相同的"抽象"类型,但它们的实例可能具有不同的子类型,因此"虚拟"生成方法不同。

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

最新更新