【发布时间】:2013-09-01 10:25:05
【问题描述】:
我读过几篇文章,表达了抽象类型应该用于在 Scala 中实现 f 有界多态性。这主要是为了缓解类型推断问题,但也是为了消除在定义递归类型时类型参数似乎引入的二次增长。
这些是这样定义的:
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
然而,这似乎引入了两个问题:
1) 每次用户想要引用此类型的对象时,他们还必须引用FBound 类型参数。这感觉像是代码异味:
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2) 编译器现在无法推断上述方法的类型参数,失败并显示以下消息:
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
是否有人在他们的解决方案中成功实现了 f 有界多态性,从而使编译器仍然能够推断类型?
【问题讨论】:
-
Scala 集合库成功地使用了 F 有界多态性,没有任何问题。它使用类型参数而不是类型成员,您可能想尝试基于此的解决方案。
-
请你给我一个例子来看看,即图书馆的哪些部分这样做?
-
参见标准库中的List。请注意在继承 GenericTraversableTemplate 和 LinearSeqOptimized 时使用的 F 有界多态性。
-
谢谢,我将在这里调查 Martin 对 f 有界多态性的使用,看看编译器是否存在与我的代码使用类型参数时相同的类型推断问题:D
-
您能告诉我们您希望这段代码具体做什么吗? mapToSomething 应该返回什么?
标签: scala generics polymorphism scala-2.10