gpt4 book ai didi

scala - 使用更高种类的类型访问上下文边界的类型构造函数参数

转载 作者:行者123 更新时间:2023-12-04 05:20:26 26 4
gpt4 key购买 nike

是否可以在上下文绑定(bind)中访问更高种类的类型构造函数参数?我希望定义一个采用更高种类的类型的特征,并具有一个返回构造函数参数实例的方法。

case class A[TContents](c: TContents) {
def foo = c
}

case class B[TContents](c: TContents) {
def foo = c
}

trait Fooable[TClass[_ <: TContents], TContents] {
def foo(obj: TClass[TContents]): TContents
}

case class AFooable[TContents] extends Fooable[A, TContents] {
def foo(obj: A[TContents]) = obj.foo
}

case class BFooable[TContents] extends Fooable[B, TContents] {
def foo(obj: B[TContents]) = obj.foo
}

class test {
def getFoo[TType[_] : Fooable, TContents](obj: TType[TContents]): TContents =
implicitly[Fooable[TType, TContents]].foo(obj)

implicit def aFooable = AFooable

val a = A(1)
val foo = getFoo(a)
}

这失败了,编译器错误提示上下文边界不能有两个类型参数,但我找不到另一种访问类型构造函数参数的方法?

最佳答案

你有两个选择——要么使用 type lambda trick部分申请Fooable (啊):

def getFoo[TType[_]: ({type L[A[_]] = Fooable[A, TContents]})#L, TContents](
obj: TType[TContents]
): TContents = implicitly[Fooable[TType, TContents]].foo(obj)

或者对上下文绑定(bind)脱糖(在我看来更好):
def getFoo[TType[_], TContents](obj: TType[TContents])(
implicit ev: Fooable[TType, TContents]
): TContents = ev.foo(obj)

请注意,无论哪种情况,您都需要提供 aFooable类型参数:
implicit def aFooable[A] = AFooable[A]

我强烈建议您遵守有关无参数列表案例类的警告。

关于scala - 使用更高种类的类型访问上下文边界的类型构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744655/

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