在函数

时间:2017-10-05 22:53:04

标签: scala shapeless

我有一个用例,我创建一个HList记录并将其传递给另一个函数,并在传递给它的函数中选择一个元素。我找不到下列任何工作的方法:

HList传递给函数中定义Witness的函数:

  def sel0[L <: HList](hl: L) = {
    val w = Witness('field1)
    implicit val selector = the[Selector[L, w.T]]
    selector(hl)
  }

或传递HListWitness并在函数中构建Selector

  def sel1[L <: HList](hl: L, w: Witness) = {
    implicit val selector = the[Selector[L, w.T]]
    selector(hl)
  }

甚至不是一个更简单的版本,其中隐含的Witness在发送到函数之前构成:

  val hl = 'field1 ->> 1 :: 'field2 ->> "2" :: HNil
  val w = Witness('field1)
  val selector = the[Selector[hl.type, w.T]]

  def sel2[L <: HList](hl: L, w: Witness)(implicit selector: Selector[L, w.T]) = {
    selector(hl)
  }

  sel2(r1, w)(selector)

有什么建议为什么以上这些不起作用?

1 个答案:

答案 0 :(得分:2)

使用此

def sel0[L <: HList](hl: L)(implicit 
  selector: shapeless.ops.hlist.Selector[L, FieldType[Witness.`'field1`.T, Int]]) = 
  selector(hl)

或者

def sel0[L <: HList](hl: L)(implicit 
  selector: shapeless.ops.record.Selector[L, Witness.`'field1`.T]) = 
  selector(hl)

selector(selector)非常奇怪。

您不需要hl.type。它是此特定hl的类型。 hl的正确类型是所有此类hl的类型,即Record.`'field1 -> Int, 'field2 -> String`.TFieldType[Witness.`'field1`.T, Int] :: FieldType[Witness.`'field2`.T, String] :: HNil