gpt4 book ai didi

scala - 为什么我不能索引到通过映射到另一个 HList 获得的 HList?

转载 作者:行者123 更新时间:2023-12-04 18:47:54 26 4
gpt4 key购买 nike

.head不起作用。

我需要做哪些改变才能使这项工作发挥作用?

import shapeless._
import HList._
import Nat._

scala> case class Foo[A](a: A)
defined class Foo

scala> case class Bar[A](f: Foo[A])
defined class Bar

scala> val xs = Foo(23) :: Foo("blah") :: HNil
xs: shapeless.::[Foo[Int],shapeless.::[Foo[java.lang.String],shapeless.HNil]] = Foo(23) :: Foo(blah) :: HNil

scala> object mapper extends (Foo ~> Bar) {
| def apply[A](f: Foo[A]) = Bar(f)
| }
defined module mapper

scala> xs map mapper
res13: mapper.Out = Bar(Foo(23)) :: Bar(Foo(blah)) :: HNil

scala> res13.apply[_1]
<console>:38: error: could not find implicit value for parameter at: shapeless.At[mapper.Out,shapeless.Nat._1]
res13.apply[_1]
^

scala> res13.head
<console>:38: error: could not find implicit value for parameter c: shapeless.IsHCons[mapper.Out]
res13.head
^

最佳答案

对我来说完全按照所写的方式工作,至少使用最新的 2.10.0-SNAPSHOT,

import shapeless._
import HList._
import Nat._

scala> case class Foo[A](a: A)
defined class Foo

scala> case class Bar[A](f: Foo[A])
defined class Bar

scala> val xs = Foo(23) :: Foo("blah") :: HNil
xs: shapeless.::[Foo[Int],shapeless.::[Foo[String],shapeless.HNil]] = Foo(23) :: Foo(blah) :: HNil

scala> object mapper extends (Foo ~> Bar) {
| def apply[A](f: Foo[A]) = Bar(f)
| }
defined module mapper

scala> xs map mapper
res0: shapeless.::[Bar[Int],shapeless.::[Bar[String],shapeless.HNil]] = Bar(Foo(23)) :: Bar(Foo(blah)) :: HNil

scala> res0[_1]
res1: Bar[String] = Bar(Foo(blah))

scala> res0.head
res2: Bar[Int] = Bar(Foo(23))

请注意,为 res0 推断的类型以上是 Bar[Int] :: Bar[String] :: HNil而不是 mapper.Out ...我怀疑这是 2.9.x 和 2.10.0-SNAPSHOT 之间的行为差​​异。

如果您坚持使用 2.9.x,那么我认为您应该能够通过归因 Bar[Int] :: Bar[String] :: HNil 来解决该问题。给您的 res13明确......显然这更冗长,但c'est la vie。

关于scala - 为什么我不能索引到通过映射到另一个 HList 获得的 HList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204501/

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