【发布时间】:2021-02-18 20:47:47
【问题描述】:
我试图在我的代码中加入一些无形的东西,但我遇到了一个令人尴尬的早期障碍。在下面的示例中,似乎 HCons 将未定义的对象添加到 HNil:
trait HasValue[A, B] {
def get(a: A): B
def getAll[L <: HList, O <: HList](a: A)(implicit ga: GetAll[A, L]): O = ga.getAll(a, HNil)
}
trait GetAll[A, B] {
def getAll[L <: HList, O <: HList](a: A, l: L): O
}
implicit def getAllIfHasValue[A, B](implicit ev: HasValue[A, B]) = new GetAll[A, B] {
def getAll[L <: HList, O <: HList](a: A, l: L): O = ev.get(a) :: l
}
并得到一个错误 - type mismatch: Found B :: L, Required O。
我会认为,因为L 本身就是HList,B :: L 本身应该是HList,因此一切都应该很好。但显然不是。
任何帮助表示赞赏!
【问题讨论】:
-
不清楚您要达到的目标。
getAll签名看起来很可疑:它表示对于每个 HList 类型L和O,您可以仅基于L和A生成O。这个函数没有合理的实现(除了总是返回HNil)。也许您想将L和O移到特征类型参数列表中。 -
@simpadjo - 是的 - 我在这里没有使用一个很好的例子。在我正在阅读的示例中,有一点让我感到有些困惑,那就是人们倾向于使用
def f[L <: HList]: L = 1 :: HNil的语法(当使用 HLists 作为函数参数或返回类型时)。为什么这里需要L类型参数对我来说并不是很明显。为什么不简单地def f: HList = 1 :: HNil? -
HListtype 没有说明其元素的类型。L也应该携带有关元素的信息。 -
@Chrisper 顺便说一句,
def f[L <: HList]: L = 1 :: HNil不正确。这就好像我写了def f[A]: A = 1。我想你应该想想 Scala 中的类型参数是什么意思。 -
@Chrisper 如果您写到
1 :: HNil的类型为HList,您将丢失有关Int :: HNil的类型级别信息。HList并不比List[Any]好。
标签: scala generics typeclass implicit shapeless