gpt4 book ai didi

scala - 从 HList 中获取元素

转载 作者:行者123 更新时间:2023-12-04 08:23:02 26 4
gpt4 key购买 nike

我玩弄了 HList 并按预期进行了以下工作:

val hl = 1 :: "foo" :: HNil
val i: Int = hl(_0)
val s: String = hl(_1)

但是,我无法让以下代码工作(让我们暂时假设随机访问列表是一个聪明的主意;-)):
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)

我想要 get返回 IntString根据它的参数。我假设,如果可能的话,我必须使用 Auxat但我不知道该怎么做。

最佳答案

沿着这些方向尝试一些东西,

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

这里的第一个关键区别是,而不是键入 hl普通 HList ,这会丢失有关元素类型的所有特定信息,我们对参数的精确类型进行参数化并将其结构保留为 L .第二个区别是我们使用 L索引隐式 At用于在 get 中执行索引的类型类实例.

另请注意,因为存在来自 Int 的隐式转换文字到 Nat你可以写,
scala> container.get(0)
res3: Int = 1

scala> container.get(1)
res4: String = foo

关于scala - 从 HList 中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535543/

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