用于减去 HList 类型的类型构造函数?
Type constructor for subtracting HList types?
我正在寻找可以将一种 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
}
如果这样的构造函数不存在,谁能指出我如何实现一个的方向?谢谢!
如果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)
这将 return 一个包含已删除元素和剩余元素(这就是您想要的)的元组。
这适用于您的示例案例,即使您的要求略有不同,the RemoveAll
implementation 也是一个不错的起点。
作为脚注,虽然 RemoveAll
是一个类型构造函数,但在这种情况下,它更像是一个类型 class。它也没有真正意义的类型 class 没有类型参数但 Aux
(通常在伴随对象中定义,而不是类型 class 本身)二。我建议看看 Aux
在 RemoveAll
类型中扮演的角色 class 作为这种模式的一个例子。
我正在寻找可以将一种 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
}
如果这样的构造函数不存在,谁能指出我如何实现一个的方向?谢谢!
如果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)
这将 return 一个包含已删除元素和剩余元素(这就是您想要的)的元组。
这适用于您的示例案例,即使您的要求略有不同,the RemoveAll
implementation 也是一个不错的起点。
作为脚注,虽然 RemoveAll
是一个类型构造函数,但在这种情况下,它更像是一个类型 class。它也没有真正意义的类型 class 没有类型参数但 Aux
(通常在伴随对象中定义,而不是类型 class 本身)二。我建议看看 Aux
在 RemoveAll
类型中扮演的角色 class 作为这种模式的一个例子。