目前我正在学习在线课程"响应式编程原理"作者: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 上下文中定义。它们是来自不同实际类型的不同生成方法。