gpt4 book ai didi

scala - 将类型参数的上限交换为证据参数

转载 作者:行者123 更新时间:2023-12-04 13:53:41 25 4
gpt4 key购买 nike

我想放宽对特征类型参数的约束,而是以证据参数的形式将它们强加给方法。给定一些骨架设置:

trait State[Repr]
object Observer {
def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] =
new Observer[Repr] {}
}
trait Observer[A]
trait Reader [A]

这有效:
trait StateX[Repr <: StateX[Repr]] extends State[Repr] { 
protected def reader: Reader[Repr]
def observe: Observer[Repr] = Observer(reader)
}

这不会:
trait StateY[Repr] extends State[Repr] { 
protected def reader: Reader[Repr]
def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}

留言 "inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]" .由于证据 ev建议这种构象,我想知道 StateY可以修复。

最佳答案

您的问题是,即使 A <:< B 形式的证据表示 A 类型的值可以转换为 B 类型的值这并不意味着 A <: B ...确实,使用类型约束或 View 绑定(bind)而不是普通类型绑定(bind)的主要原因正是因为这种子类型关系不成立。

因此 StateY 中的约束, Repr <:< State[Repr] , 不足以满足界限 Repr <: State[Repr]Observerapply方法。假设您想放松对 StateX 的约束的类型参数,您唯一的选择是削弱对 apply 的约束。方法的类型参数对应。这让你使用 View 绑定(bind)而不是普通类型绑定(bind)得到类似下面的东西,

object Observer {
def apply[Repr <% State[Repr]](reader : Reader[Repr]) : Observer[Repr] =
new Observer[Repr] {}
}

或者,
object Observer {
def apply[Repr](reader : Reader[Repr])
(implicit ev : Repr <:< State[Repr]) : Observer[Repr] =
new Observer[Repr] {}
}

如果您更愿意在整个过程中使用约束。

关于scala - 将类型参数的上限交换为证据参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702654/

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