使用case类apply:类型类a的成员不在T的作用域中



由于隐式转换,我在编译函数时遇到了麻烦。我有以下基本情况类:

sealed abstract class Expr0[T](implicit ev: VectorSpace0[T]) extends ID {...
case class Neg0[T](e: Expr0[T])(implicit ev: VectorSpace0[T]) extends Expr0[T] { ...

那么在一个对象中,我有以下函数

  def simplify[T](e: Expr0[T])(implicit ev: VectorSpace0[T]): Expr0[T] = {
    def s(expr: Expr0[T])(implicit ev: VectorSpace0[T]): Result[Boolean, T] = expr match {
      case Neg0(e)                            => 
        val re = s(e)
        val ne = Neg0.apply(re.e)
        if (re.r) new TR(ne) else FR(ne)

上面的代码编译正确,没有问题。现在我想创建一个函数来执行这个例子中的语句序列。因此,我创建了以下帮助函数:

  def C[T](f: Expr0[T] => Expr0[T], re: Result[Boolean, T])(implicit ev: VectorSpace0[T]) = {
    val ne = f(re.e); if (re.r) new TR(ne) else FR(ne)
  }

现在我试着用so:

  def simplify[T](e: Expr0[T])(implicit ev: VectorSpace0[T]): Expr0[T] = {
    def s(expr: Expr0[T])(implicit ev: VectorSpace0[T]): Result[Boolean, T] = expr match {
      case Neg0(e)                            => 
        C(Neg0.apply, s(e))

,我得到错误:

 /src/main/scala/ann/unit/Expr0.scala:412: No member of type class ann.uinit.VectorSpace in scope for T
        C(Neg0.apply, s(e))
               ^

我已经戳戳戳了几个小时了,但没有运气。我认为这里的问题是C[T](第三代码段)的定义。也许我需要在第一个参数f的定义中添加一些东西,它是一个函数,这样隐式的T就能正确确定。

谁能告诉我如何纠正或进一步诊断这个问题?

TIA

嵌套相同类型和名称的隐式看起来有点乱。这个消息可能会误导人,可能是在Neg0中eta展开。apply是罪魁祸首,可能是C[T]中的缺少对T的类型推断。

我建议你先显式调用,看看错误是否缩小了:

C[T](Neg0[T](_), s(e))

相关内容

  • 没有找到相关文章

最新更新