【问题标题】:How to achieve F-bounded poly-morphism with a mixin?如何使用 mixin 实现 F 有界多态性?
【发布时间】:2017-04-26 23:45:51
【问题描述】:

假设我有一个混合特征,我想定义一个方法,其返回类型取决于特征混合到的对象的最终类型...

trait MultiUnit extends Quantity {
  this: Order =>

  def split(unmatchedQuantity: Long): (???, ???)

}

...例如,如果我有一个混入 MultiUnit 的案例类,我希望返回类型如下所示...

case class MultiUnitLimitOrder(price: Double, quantity: Long) extends Order with MultiUnit {

  def split(unmatchedQuantity: Long): (MultiUnitLimitOrder, MultiUnitLimitOrder) = ???

}

...如果可能的话,我更喜欢使用类型成员而不是类型参数的解决方案。

【问题讨论】:

  • 正则 F-Bound 多态性会将 MultiUnit 的类型绑定为上限。这是否足够,或者您是否试图将其限制为与MultiUnit 混合的特定类型?
  • @YuvalItzchakov 我认为上限就足够了,但我不完全确定......

标签: scala polymorphism mixins


【解决方案1】:

我不会像你上面建议的那样使用抽象类型成员,f bounded 是正确的方法。如果您提前不知道 T 的类型,则该类型成员模式很有用,例如您正在计算一个类型。当您请求隐含证据时,Shapeless 一直使用该模式,例如:

def test[Computed]()(implicit gen: Generic.Aux[Source, Computed]): Result[Computed] = {}

这用于将Generic 类中的内部类型成员的值“转移”到Computed,上面的类型参数。

在你的情况下,除非你绝对必须,否则保持简单。

trait Order
trait Quantity

trait MultiUnit[T <: MultiUnit[T]] extends Quantity {
  this: Order =>

  def split(unmatchedQuantity: Long): (T, T)
}

case class MultiUnitLimitOrder(price: Double, quantity: Long) 
  extends Order with MultiUnit[MultiUnitLimitOrder] {
    override def split(unmatchedQuantity: Long): (MultiUnitLimitOrder, MultiUnitLimitOrder) = ???
}

我也不明白为什么您需要将self-type 绑定到this: Order 而不仅仅是简单的with Order

【讨论】:

  • OP 说:“如果可能的话,我更喜欢使用类型成员而不是类型参数的解决方案。”
  • @YuvalItzchakov 我的意思是就像 OP 建议的那样,别担心,我知道你只是给了他他想要的东西。
【解决方案2】:

如果MultiUnit 的上限足够,您可以这样做:

trait Order
trait Quantity

trait MultiUnit extends Quantity {
  this: Order =>
  type T <: MultiUnit

  def split(unmatchedQuantity: Long): (T, T)
}

case class MultiUnitLimitOrder(price: Double, quantity: Long) 
  extends Order with MultiUnit {
    override type T = MultiUnitLimitOrder
    override def split(unmatchedQuantity: Long): (MultiUnitLimitOrder, MultiUnitLimitOrder) = ???
}

【讨论】:

  • 如果上限不够,是否有替代方案?
猜你喜欢
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多