gpt4 book ai didi

scala - 隐式搜索不指导类型推断在 Scala 中查找父类(super class)型

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

在下面的代码中,我有 R[A] 的证据并且 BA 的子类型,所以我希望 foo 来推断 A 的类型并使用 RA 证据。然而,scalac 拒绝这样做。

trait R[T]

case class A(i: Int)

object A {

implicit object RA extends R[A]

}

class B(i: Int) extends A(i)

def foo[T](x : T)(implicit ev: R[T]) = 0

println(foo(new B(1))) // infers T as B and fails to find implicit R[B]

println(foo(new B(1) : A)) // Works, but undesirable

我试过这个:

def foo[T, TT >: T](x : T)(implicit ev: R[TT]) = 0

但是还是不行。

现在,如果我定义:

def foo[T](x : T)(implicit ev: R[TT] forSome {type TT <: T}) = 0

推理有效,但在我的实际代码中我需要引用 TT。

编辑:现在我已将 A 的证据移至 A 伴随对象,此解决方案似乎不再有效。在现实环境中,证据总是在伴随对象中,隐式搜索必须找到它。

另一个解决方案是让我的证据逆变,但这给我带来了很多麻烦,比如推断 Nothing 和其他问题(我的实际代码比这个简化的例子更复杂)。

我怎样才能使它正常工作?

最佳答案

你可以使用

def foo[T, TT](x : T)(implicit ev: R[_ >: T] with R[TT]) = 0

并引用TT。

编辑:以下代码使用逆变来在伴生对象中查找证据。它还编码 TT 是 T 的父类(super class)型。它不会推断 Nothing,但您已经提到了逆变的其他问题。是否可以解决这些问题?

trait R[-T]

case class A(i: Int)

object A {

implicit object RA extends R[A]

}

class B(i: Int) extends A(i)

def foo[T, TT](x : T)(implicit ev1: R[T] with R[TT], ev2: T <:< TT) = 0

println(foo(new B(1))) // infers TT as A

关于scala - 隐式搜索不指导类型推断在 Scala 中查找父类(super class)型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509637/

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