如何为Product和Record创建重载?

时间:2016-01-18 03:40:21

标签: shapeless

由于它们都是HList类型,我必须创建具有不同名称的函数。以下是kittens

中的示例
 //sequence a product HList
 trait Sequencer[L <: HList] {
  type Out
  def apply(in: L): Out
}

//sequence an extensible record HList
trait RecordSequencer[L <: HList] {
  type Out
  def apply(in: L): Out
}

implicit class sequenceOps[L <: HList](self: L) {
    def sequence(implicit seq: Sequencer[L]): seq.Out = seq(self)
    def sequenceRecord(implicit seq: RecordSequencer[L]): seq.Out = seq(self) //version for extensible records
}

请注意,我必须使用名称sequenceRecord与产品HList的序列方法不同。我发现这很随意而且很麻烦。 有没有办法让可扩展记录和产品HList具有相同名称的序列方法?或者您是否总是必须为这两种HList提供两个不同的名称?

1 个答案:

答案 0 :(得分:1)

您可以使用shapeless.ops.record.Keys的{​​{1}}实例来区分记录和非记录L。然后剩下的工作是处理隐含的优先级,以确保两个扩展方法不冲突。像下面这样的东西可以完成这项工作,

HLists