有没有一种方法可以使用对象的类型作为类型参数的参数?

问题描述

我正在尝试使用无形状来对Hlist进行添加删除。但我似乎无法使其正常工作。

所以这是我的清单:

object ShapelessExample {

    import shapeless._

    def main(args: Array[String]): Unit = {

        case class Container[T <: Singleton](name: T)

        val a = Container("A") :: Container("B") :: Container("C") :: HNil
        val b = Container("B") :: Container("C") :: HNil

        println {
            a.removeAll[b.type] //doesn't work
        }
    }
}

因此removeAll上的Hlist方法只接受一个类型参数,但我似乎无法使用b.type。我可以手动指定a.removeAll[Container["B"] :: Container["C"] :: HNil],但是有什么方法可以只使用b的类型?

解决方法

Shapeless尝试精确删除类型b.type,但在Container["A"] :: Container["B"] :: Container["C"] :: HNil中找不到它,因此 @user 是正确的,单例类型b.type太具体了。

为了从HList单例类型推断出val类型,请尝试修改方法

implicit class RemoveAllOps[L <: HList](a: L) {
  def removeAll[L1 <: HList](b: L1)(implicit
    ra: shapeless.ops.hlist.RemoveAll[L,L1]
  ): ra.Out = ra(a)
}

a.removeAll(b) // (Container(B) :: Container(C) :: HNil,Container(A) :: HNil)

implicit class RemoveAllOps[L <: HList](a: L) {
  def removeAllFrom[O <: Singleton] = new {
    def apply[L1 >: O <: HList]()(implicit
      ra: shapeless.ops.hlist.RemoveAll[L,L1]
    ): ra.Out = ra(a)
  }
}

a.removeAllFrom[b.type]() //(Container(B) :: Container(C) :: HNil,Container(A) :: HNil)