我玩弄了HList,并按预期方式进行了以下工作:
val hl = 1 :: "foo" :: HNil
val i: Int = hl(_0)
val s: String = hl(_1)
Run Code Online (Sandbox Code Playgroud)
但是,我无法使下面的代码工作(让我们假设片刻随机访问是一个聪明的想法;-)):
class Container(hl: HList) {
def get(n: Nat) = hl(n)
}
val container = new Container(1 :: "foo" :: HNil)
val i: Int = container.get(_0)
val s: String = container.get(_1)
Run Code Online (Sandbox Code Playgroud)
我想有get回报的Int,并String根据它的参数.我假设,如果可能的话,我必须使用Aux或at但我不知道该怎么做.
尝试以下方法
scala> import shapeless._, nat._, ops.hlist._
import shapeless._
import nat._
import ops.hlist._
scala> class Container[L <: HList](hl: L) {
| def get(n: Nat)(implicit at: At[L, n.N]): at.Out = hl[n.N]
| }
defined class Container
scala> val container = new Container(1 :: "foo" :: HNil)
container: Container[shapeless.::[Int,shapeless.::[String,shapeless.HNil]]] = ...
scala> container.get(_0)
res1: Int = 1
scala> container.get(_1)
res2: String = foo
Run Code Online (Sandbox Code Playgroud)
这里的第一个关键区别是,我们不会参数化确切类型的参数,而是将参数的结构保留为,而不是hl普通输入,因为HList它会丢失有关元素类型的所有特定信息L。第二个区别是,我们用于L索引隐式At类型类实例,该实例用于在中执行索引get。
另请注意,由于存在从Int文字到的隐式转换,因此Nat您可以编写,
scala> container.get(0)
res3: Int = 1
scala> container.get(1)
res4: String = foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |