and*_*lla 7 functional-programming scala shapeless
我正在尝试使用无形的方式以类型安全的方式轻松地累积对象.
问题是我想要concat(:::)两个HList.我遇到了一个新手(似乎至少)问题.它错过了Prepend上下文中的隐式实例.
然而,寻找到hlist.scala,我可以看到,一般implicit def是在对象中定义Prepend和PrependAux.
添加import Prepend和import 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
}
Run Code Online (Sandbox Code Playgroud)
现在在控制台中:
[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
Run Code Online (Sandbox Code Playgroud)
什么应该烧我的眼睛?
谢谢
编辑
稍微更新一点,重新复杂化一点真正的问题,因为庸俗化之前是强大的.
这是我能做的事情:
case class A[L<:HList](a:L) {
def doSmth[C <:HList](c:C) = a ::: c
}
Run Code Online (Sandbox Code Playgroud)
所以我不能访问真实类型,只有我知道它们是HList.
Tra*_*own 10
向上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
Run Code Online (Sandbox Code Playgroud)
或者只是推断类型,这通常更方便:
val a = 1 :: 4 :: "A" :: HNil
val b = "R" :: false :: HNil
val c = a ::: b
Run Code Online (Sandbox Code Playgroud)
回应你的评论:你可以做你想要的,如果你确定你已经得到了你需要的证据(请注意,我认为这a: A是一个错字a: L,你需要-Ydependent-method-types这个工作):
case class A[L <: HList](a: L) {
def doSmth[C <: HList](c: C)(implicit p: Prepend[L, C]) = a ::: c
}
Run Code Online (Sandbox Code Playgroud)
通常,您可以查看正在使用的操作所必需的含义,然后将它们包含在您的方法中.
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |