目前我正在学习在线课程"反应式编程原理" 作者: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)如果它们是相同的,那么编译器如何解释生成方法,因为它是由它自己定义的?
答案 0 :(得分:1)
我想我得到了答案
1)输入函数f的Generator [S]和flatMap方法返回的Generator [S]具有相同的“抽象”类型,但它们的实例可能有不同的子类型,因此“虚拟”生成方法不同。
2)输入函数f返回的Generator [S]的generate方法必须已经在flatMap上下文中定义。它们是不同的生成方法,来自不同的实际类型。