5

でも.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
                    ^
4

1 に答える 1

6

少なくとも最新の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] :: HNilmapper.Outこれは2.9.xと2.10.0-SNAPSHOTの動作の違いだと思います。

2.9.xに固執している場合はBar[Int] :: Bar[String] :: HNilres13明示的に説明することで問題を回避できるはずです...明らかにそれはより冗長ですが、c'estlavieです。

于 2012-06-26T10:38:25.353 に答える