在函数中隐式构建 Shapeless
Build Shapeless implicit in the function
我有一个用例,我创建了一个 HList 记录并将其传递给另一个函数,select 它传递给的函数中的一个元素。我找不到进行以下任何工作的方法:
将 HList
传递给具有函数中定义的 Witness
的函数:
def sel0[L <: HList](hl: L) = {
val w = Witness('field1)
implicit val selector = the[Selector[L, w.T]]
selector(hl)
}
或传递 HList
和 Witness
并在函数
中构建 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)
以上这些不起作用的任何建议?
用这个
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`.T
或 FieldType[Witness.`'field1`.T, Int] :: FieldType[Witness.`'field2`.T, String] :: HNil
.
我有一个用例,我创建了一个 HList 记录并将其传递给另一个函数,select 它传递给的函数中的一个元素。我找不到进行以下任何工作的方法:
将 HList
传递给具有函数中定义的 Witness
的函数:
def sel0[L <: HList](hl: L) = {
val w = Witness('field1)
implicit val selector = the[Selector[L, w.T]]
selector(hl)
}
或传递 HList
和 Witness
并在函数
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)
以上这些不起作用的任何建议?
用这个
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`.T
或 FieldType[Witness.`'field1`.T, Int] :: FieldType[Witness.`'field2`.T, String] :: HNil
.