来自Martin Odersky在线scala课程的Generator中的flatMap

时间:2014-12-06 16:14:35

标签: 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 => 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,它返回一个新的Generator [S]和定义的生成方法,但其实现取决于"其他"从"其他"生成方法来自输入函数参数f的生成器[S]。

以下是我的问题:

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

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

1 个答案:

答案 0 :(得分:1)

我想我得到了答案

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

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