gpt4 book ai didi

scala - Scala 中具有抽象类型的 F 界多态性

转载 作者:行者123 更新时间:2023-12-03 00:04:08 25 4
gpt4 key购买 nike

我读过几篇文章,表达了应该使用抽象类型来实现 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 有界多态性,从而编译器仍然能够推断类型?

最佳答案

我后来意识到,在大多数情况下应该避免 f 有界多态性 - 或者更确切地说 - 通常您应该选择另一种设计。要了解如何避免它,我们首先需要知道是什么让我们需要它:

F-bounded polymorphism occurs when a type expects important interface changes to be introduced in derived types.

通过组合预期的变更区域而不是尝试通过继承来支持它们,可以避免这种情况。这实际上又回到了四人帮设计模式:

Favor 'object composition' over 'class inheritance'

-- (Gang of Four, 1995)

例如:

trait Vehicle[V <: Vehicle[V, W], W] {
def replaceWheels(wheels: W): V
}

变成:

trait Vehicle[T, W] {
val vehicleType: T
def replaceWheels(wheels: W): Vehicle[T, W]
}

此处,“预期变化”是车辆类型(例如 BikeCarLorry)。前面的示例假设这将通过继承添加,需要一个 f 边界类型,这使得使用 Vehicle 的任何函数都无法推断 W。使用组合的新方法不会出现此问题。

参见:https://github.com/ljwagerfield/scala-type-inference/blob/master/README.md#avoiding-f-bounded-polymorphism

关于scala - Scala 中具有抽象类型的 F 界多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com