我正在寻找一种类型的构造函数,它可以用另一个HList类型减去一个HList类型。
trait Subtract {
type Aux[Full <: HList, ToSubract <: HList] = ???
}
object SubtractExample {
type AList = ClassA :: ClassB :: HNil
type BList = ClassB :: HNil
Subtract.Aux[AList, BList] == ClassA :: HNil
}
如果这样的构造函数不存在,有人可以指向我如何实现一个的方向吗?谢谢!
答案 0 :(得分:4)
如果AList
始终按顺序包含BList
的元素(但不一定是连续的),则可以使用RemoveAll
:
import shapeless._, ops.hlist.RemoveAll
trait ClassA; trait ClassB
type AList = ClassA :: ClassB :: HNil
type BList = ClassB :: HNil
val remover = RemoveAll[AList, BList]
remover(new ClassA {} :: new ClassB {} :: HNil)
这将返回已删除元素和剩余部分的元组(这是您想要的)。
这适用于您的示例案例,即使您的要求略有不同,the RemoveAll
implementation也是一个很好的起点。
作为脚注,虽然RemoveAll
是类型构造函数,但在此上下文中它更类似于类型类。如果类型参数没有类型参数,而且Aux
(通常在伴随对象中定义,而不是类型类本身)有两个,那么它也没有意义。我建议查看Aux
类型类中的RemoveAll
角色作为此模式的示例。