有没有办法使用对象的类型作为类型参数的参数?
Is there a way to use the type of an object as the argument of a type parameter?
我正在尝试使用 shapeless 对 Hlist
s 进行添加和删除。但我似乎无法让它工作。
所以这是我的列表:
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
}
}
}
所以 Hlist
上的 removeAll
方法只接受一个类型参数,但我似乎不能使用 b.type
。我可以手动指定 a.removeAll[Container["B"] :: Container["C"] :: HNil]
,但是有什么方法可以只使用 b
的类型吗?
Shapeless 尝试精确删除类型 b.type
但无法在 Container["A"] :: Container["B"] :: Container["C"] :: HNil
中找到它所以 @user 是正确的,单例类型 b.type
太具体了。
为了从 val
单例类型推断出 HList
类型,尝试修改方法
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)
我正在尝试使用 shapeless 对 Hlist
s 进行添加和删除。但我似乎无法让它工作。
所以这是我的列表:
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
}
}
}
所以 Hlist
上的 removeAll
方法只接受一个类型参数,但我似乎不能使用 b.type
。我可以手动指定 a.removeAll[Container["B"] :: Container["C"] :: HNil]
,但是有什么方法可以只使用 b
的类型吗?
Shapeless 尝试精确删除类型 b.type
但无法在 Container["A"] :: Container["B"] :: Container["C"] :: HNil
中找到它所以 @user 是正确的,单例类型 b.type
太具体了。
为了从 val
单例类型推断出 HList
类型,尝试修改方法
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)