gpt4 book ai didi

scala - 无形 : Prepend. 未找到隐式

转载 作者:行者123 更新时间:2023-12-03 21:07:05 25 4
gpt4 key购买 nike

我正在尝试使用 shapeless 以类型安全的方式轻松积累对象。

问题是当我想连接( ::: )两个 HList 时.我遇到了一个新手(至少似乎是)问题。它错过了 Prepend上下文中的隐式实例。

但是,查看 hlist.scala ,我可以看到泛型 implicit def在对象中定义 PrependPrependAux .

添加 import Prependimport PrependAux手动没有改变任何东西(显然......)。

所以这里的代码减少到最低限度:

enter code here

import shapeless._
import HList._
import Prepend._
import PrependAux._

object test {

val a:HList = 1 :: 4 :: "A" :: HNil
val b:HList = "R" :: false :: HNil

val c:HList = a ::: b // <<<<<<<<<<< NEEDS A Prepend in the context

}

现在在控制台中:
[error]     test.scala:10: could not find implicit value for parameter prepend: shapeless.Prepend[shapeless.HList,shapeless.HList]
[error] val c:HList = a ::: b // this needs an implicit Prepend in the current context

什么应该烧我的眼睛?

谢谢

编辑

一点点更新,重新把真正的问题复杂化了一点,因为以前去庸俗化太强了。

这是我可以做的事情:
case class A[L<:HList](a:L) { 
def doSmth[C <:HList](c:C) = a ::: c
}

所以我无法访问真正的类型,只有我知道它们是 HList 。

最佳答案

向上转换到 HList 是这里的问题。使用普通的旧 HList 几乎无能为力(除了向其中添加新元素)。

您可以提供更多信息类型注释:

val a: Int :: Int :: String :: HNil = 1 :: 4 :: "A" :: HNil
val b: String :: Boolean :: HNil = "R" :: false :: HNil
val c: Int :: Int :: String :: String :: Boolean :: HNil = a ::: b

或者只是让类型被推断出来,这通常更方便:
val a = 1 :: 4 :: "A" :: HNil
val b = "R" :: false :: HNil
val c = a ::: b

回应您的评论:如果您确保获得所需的证据,您可以做您想做的事(请注意,我假设 a: Aa: L 的拼写错误,并且您需要 -Ydependent-method-types 才能使其工作):
case class A[L <: HList](a: L) {
def doSmth[C <: HList](c: C)(implicit p: Prepend[L, C]) = a ::: c
}

通常,您只需查看您正在使用的操作所需的隐式,然后将它们包含在您的方法中。

关于scala - 无形 : Prepend. 未找到隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com