用于减去HList类型的类型构造函数?

时间:2015-11-13 17:39:55

标签: scala shapeless

我正在寻找一种类型的构造函数,它可以用另一个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
}

如果这样的构造函数不存在,有人可以指向我如何实现一个的方向吗?谢谢!

1 个答案:

答案 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角色作为此模式的示例。