即使.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
^
Run Code Online (Sandbox Code Playgroud)
完全按照我的书面编写,至少使用最新的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))
Run Code Online (Sandbox Code Playgroud)
请注意,res0上面推断的类型Bar[Int] :: Bar[String] :: HNil不是mapper.Out......我怀疑这是2.9.x和2.10.0-SNAPSHOT之间行为的差异.
如果你坚持使用2.9.x那么我认为你应该能够通过明确地归咎于你来解决这个问题......显然,这更加冗长,但是Bar[Int] :: Bar[String] :: HNil对于你来说res13.