用于减去 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 本身)二。我建议看看 AuxRemoveAll 类型中扮演的角色 class 作为这种模式的一个例子。